我正在尝试制作一个线程端口扫描程序,但它不能按我预期的方式工作。生成输出时的代码会产生乱码输出。我知道这是因为有些线程已经完成了其他线程所以它们将他们的输出打印到屏幕上,但我不知道如何防止它。
import threading
import socket
portlist = [21,22,25,80,110,443]
open = []
closed = []
failed = 0
length = 0
ip = None
site_ = None
ip = None
def portscan(site,port):
global failed
global length
global failed
global length
global ip
global site_
try:
socket.setdefaulttimeout(2)
s = socket.socket()
s.connect((site,port))
open.append(port)
s.close()
print("[SCANNING...]")
except:
closed.append(port)
failed = failed + 1
print("[SCANNING...]")
length = length + 1
def statistics():
try:
avg = failed/length*100
except:
avg = 0
print("<PORTS OPEN>")
print(open)
print("<PORTS CLOSED>")
print(closed)
print("PACKETS SENT:",length,"| PACKETS LOST:",failed,"[",avg,"% loss]")
def main():
site_ = input("/ENTER SITE IP OR NAME/>")
try:
ip = socket.gethostbyname(site_)
except:
ip = "COULD NOT GET IP"
for port in portlist:
t = threading.Thread(target = portscan, args = (site_,port))
t.start()
print("<---SCAN STATISTICS FOR",site_,"[",ip,"] RETURNED--->")
statistics()
if __name__ == "__main__":
main()
wait = input("")
以下是我在特定网站上运行代码时得到的输出。在程序完成扫描之前,您可以看到打开和关闭的端口打印
<---SCAN STATISTICS FOR www.gmail.com [ 74.125.68.18 ] RETURNED--->
<PORTS OPEN>
[]
<PORTS CLOSED>
[]
PACKETS SENT: 0 | PACKETS LOST: 0 [ 0 % loss]
[SCANNING...]
[SCANNING...]
[SCANNING...]
[SCANNING...]
[SCANNING...]
[SCANNING...]
我想要的是在打印端口之前完成的线程。
答案 0 :(得分:1)
你应该等待(致电 .join )让你的线程完成
threads = []
for port in portlist:
t = threading.Thread(target = portscan, args = (site_,port))
t.start()
threads.append(t)
#now wait for them to finish
for t in threads:
t.join()