Python端口扫描中的线程

2024-09-29 19:26:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图用Python编写一个非常简单的端口扫描程序,在我决定引入线程来加快速度之前,它一直工作得很好。在

我想在结尾加上一个简短的摘要,其中列出了打开的端口。我把它放在一个名为finish的函数中。然而,自从引入线程之后,不管我把它放在哪里,这个摘要都会作为代码输出的第一行出现。在

有没有一种方法可以有效地将线程限制在我需要它的函数上,然后在它到达summary/finish()之前关闭它,还是我犯了一个明显的错误?任何帮助都将不胜感激。在

代码:

from socket import *
from threading import *
screenLock = Semaphore(value=1)

open_ports = []

def scan(ip,port):

    try:
        s = socket(AF_INET, SOCK_STREAM)
        s.connect((ip, port))
        screenLock.acquire()
        print ('Scanning ', ip , 'on port',  port)
        print("Port",port, "is open")
        s.close()
        summary(port)

    except:
        screenLock.acquire()
        print ('Scanning ', ip , 'on port',  port)
        print("Port",port,"is closed")

    finally:
        screenLock.release()
        s.close()

def loop():

    for i in range(1,100):
        ip = '192.168.0.38'
        port = int(i)
        t = Thread(target=scan, args=(ip,int(port)))
        t.start()

    return

def summary(port):

    global open_ports
    open_ports.append(port)
    return      

def main():    
    loop()
    finish()

def finish():

    print('The following ports are open:',open_ports) 


main()

Tags: 函数代码fromimportipportdefsocket
1条回答
网友
1楼 · 发布于 2024-09-29 19:26:41

您必须等待所有线程完成:

def loop():
    threads = []
    for i in range(1,100):
        ip = '192.168.0.38'
        port = int(i)
        t = Thread(target=scan, args=(ip,int(port)))
        t.start()
        threads.append(t)
    [t.join() for t in threads]

相关问题 更多 >

    热门问题