用threading和Queue模块实现多线程的端口扫描器

一.Queue模块基础

q = Queue.Queue()    
q.qsize()           返回队列的大小  
q.empty()         如果队列为空,返回True,反之False  
q.full()          如果队列满了,返回True,反之False
q.full              与 maxsize 大小对应  
q.get([block[, timeout]]) 获取队列,timeout等待时间  
q.get_nowait()         相当q.get(False)
q.put(item)           写入队列,timeout等待时间  
q.put_nowait(item)    相当q.put(item, False)
q.task_done()         在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join()             实际上意味着等到队列为空,再执行别的操作

二.threading模块基础


t = threading.Thread             使用它来创建线程
t.start()                           开始线程的执行
t.run()                           包含了线程实际执行的内容
t.join(timeout=None)               被调用 join() 方法的线程会一直阻塞调用者的线程,直到自己结束
t.name                           用于鉴别进程的一个字符串
t.getName()/t.setName()           为后向兼容而保留的方法,现在请直接通过 name 属性来访问
t.ident                           如果线程还未开始,则值为 None
t.is_alive()                       返回本进程是否是 alive 状态
t.daemon                       标明本进程是否为“daemon thread”。一定要在 start() 被调用前设定,否则引发 RuntimeError。
t.isDaemon() / t.setDaemon()        为后向兼容而保留的方法,现在请直接访问 daemon 属性
lock = threading.Lock
lock.acquire(blocking=True,timeout=-1)        获取一个锁
lock.release()                              释放一个锁

三.多线程端口扫描器

# -*- coding: utf-8 -*-
__author__ = 'Dleo'
import sys
import socket
import threading
import Queue

ports=[21,80,445,3389]
queue = Queue.Queue()

def ip_c(ip):
    new_ip = []
    for ip_c in range(1,255):
        new_ip.append(str(ip) + "." + str(ip_c))
        #print new_ip
    return new_ip

class ThreadNum(object):
    def __init__(self, queue):
        self.queue = queue
        self.lock = threading.Lock()
    def port_open(self):
        while True:
            try:
                try:
                    ip = self.queue.get(timeout=1)
                except:
                    break
                for port in ports:
                    socket.setdefaulttimeout(0.5)
                    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    if s.connect_ex((ip, port)) == 0:
                        self.lock.acquire()
                        print (ip + ':' + str(port) + ' is openning')
                        self.lock.release()
                    s.close()
            except:
                pass
            self.queue.task_done()
    def run (self):
        tmp = []
        for i in range(255):
            t = threading.Thread(target=self.port_open)
            t.setDaemon(True)
            t.start()
            tmp.append(t)
        for t in tmp:
            t.join()
            
if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "please put ip like this '127.0.0' "
        sys.exit()
    ip = sys.argv[1]
    for i in ip_c(ip):
        queue.put(i)
    t = ThreadNum(queue)
    t.run()

效果图:

posted @ 2016-08-18 12:16  Dleo  阅读(474)  评论(0编辑  收藏  举报