带有线程的Python重复IP扫描

时间:2018-08-09 09:34:51

标签: python python-3.x multithreading

重复ip扫描后,程序崩溃。线程没有被杀死,我也不知道该怎么做。有想法吗?

import time
import datetime
import subprocess,os,threading
from queue import Queue

ipbase = "192.168.101.{0}"
startadd = 20
stoppadd = 100

def ipscan(): #looking for available IP adresses
    lock=threading.Lock()
    _start=time.time()

    def check(n):
        with open(os.devnull, "wb") as limbo:
            ip=ipbase.format(n)
            result=subprocess.Popen(["ping", "-n", "2", "-w", "300", ip],stdout=limbo, stderr=limbo).wait(timeout=10)
            with lock:                    
                if not result:
                    print (ip, "active")
                else:
                    pass 

    def threader():
        while True:
            worker=q.get()
            check(worker)
            q.task_done()
    print("Scan IP...")        
    print("Address scan from " + ipbase + str(startadd) + " until " + ipbase    + str(stoppadd))
    q=Queue()
    for _ in range(startadd,stoppadd):
        t=threading.Thread(target=threader)
        t.daemon=True
        t.start()

    for worker in range(startadd,stoppadd):
        q.put(worker)
    q.join()

if __name__ == "__main__":
    starttime = datetime.datetime.now()
    print (starttime)
    print("first check of available ip adresses..")
    ipscan() #looking for available IP adresses

    cyclebegin = datetime.datetime.now()
    acttime = datetime.datetime.now()
    sampletime = 3
    while (1):
        if ((acttime - cyclebegin) > datetime.timedelta(seconds=sampletime)):
            dtime = acttime - cyclebegin
            print ("delta-seconds: ",dtime.seconds)
            cyclebegin = datetime.datetime.now()

            ipscan()

        acttime = datetime.datetime.now()

据我所知,在用q.join()完成ipscan之后,应该完成任务,但不能杀死它们。随着ipscan的反复调用,线程的限制已被超越。为防止这种情况,我必须进行哪些修改?

0 个答案:

没有答案