banner

Сканер портов

Давно ничего не писал, совсем разленился, да и писать не о чём. Зашёл тут недавно глупый спор о скорости работы сокетов на perl и python, пришлось написать простой многопоточный скриптик. Пригодится может кому, для изучения python. В результате мой метод оказался хитрее и быстрей :)

# coding:utf-8
# author: Rushter
# site: http://klipner.ru
import socket,Queue,threading
from time import time
queue = Queue.Queue()
HOST = "localhost"  
COUNT = 1000
THREADS=100
TIMEOUT = 0.01
def worker():
    global queue
    while True:
        try:
            target =  queue.get_nowait()
        except Queue.Empty:
            return 
        check(target)
 
def check(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(TIMEOUT)    
    try:
        sock.connect((HOST, port))
    except:
        return
    print port
    sock.close()
def main():
    t1 = time()
    for i in xrange(COUNT):
        queue.put(i)
    for _ in xrange(THREADS):
        thread_ = threading.Thread(target=worker)
        thread_.start()
    while threading.active_count() >1:
        pass
    t2 = time()
    print t2-t1
main()