Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 16, 2017 20:45:55

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Создание таймера для прерывания итерации в основном потоке

 ты ничего не перепутал? только что пробовал, все выполнилось за 3 сек

 #!/usr/bin/env python
import sys
import gevent
from gevent import socket
found = []
def ip2url(ip):
    try:
        url = socket.gethostbyaddr(ip)
        found.append([ip,url[0]])
    except:
        pass
        
addrs = ['87.250.250.%s' % i for i in range(1,255)]  
for addr in addrs:
    gevent.spawn(ip2url,addr).join(timeout=0.1)
for i in found:print i
sys.exit()
 вообще у меня макось, за винду не скажу

Офлайн

#2 Июнь 19, 2017 09:02:09

UrfinJuice
Зарегистрирован: 2017-05-05
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

vic57, в рабочей сети вроде нормально работает. В виртуалке все-равно 100% результата я так и не добился, но мне это и не так важно. Я правильно понимаю: последний скрипт порождает 254 микропотока, они выполняются последовательно и если каждый из них не успевает за 0.1сек, то выполняется следующий? Метод .join() стоит внутри цикла, а не снаружи, поэтому никакого миниDDOSа не будет, верно?

Офлайн

#3 Июнь 19, 2017 13:17:37

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Создание таймера для прерывания итерации в основном потоке

ты правильно понимаешь. создается один гринлет с таймаутом 0.1 сек. оптимально я думаю так:

 #!/usr/bin/env python
import sys
import gevent
from gevent import socket
from gevent.pool import Pool
from time import time
def ip2url(ip):
    try:
        url = socket.gethostbyaddr(ip)
        found.append(ip +' : '+ url[0])
    except:
        pass
    
if __name__=="__main__":
    #addrs = ['173.194.222.%s' % i for i in range(1,255)] #google 
    #addrs = ['87.250.250.%s' % i for i in range(1,255)]  #yandex
    #addrs = ['94.100.180.%s' % i for i in range(1,255)] #mail.ru
    addrs = ['81.19.82.%s' % i for i in range(1,255)] #rambler
    pool = Pool(10)
    found = []
    t1 = time()
    with gevent.Timeout(5,False):
        for addr in addrs:
            pool.spawn(ip2url,addr)
        pool.join()
    t2 = time()
    for i in found: print i
    print 'time:',t2 - t1,'found:',len(found)
    sys.exit()
создается пул из 10 гринлетов с суммарным таймаутом 5 сек
но тут много факторов - сколько серверов в цепочке, кэшируют ли они запросы, как у них система безопасности настроена и т.д. у тебя на виртуалке днс сервер поднят ? имхо смысл есть тока реальные адреса сканить, но если админ не спит, за такие зксперименты вполне реально люлей огрести -
IDS

Отредактировано vic57 (Июнь 19, 2017 14:45:21)

Офлайн

#4 Июнь 19, 2017 15:25:48

UrfinJuice
Зарегистрирован: 2017-05-05
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание таймера для прерывания итерации в основном потоке

vic57, сделал так. Работает и славно. Матчасть буду подтягивать, а то сложновато так с наскока… В плане IDS, тут проблем нет.
Спасибо за помощь!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version