多线程Python端口扫描器
我在修改一个端口扫描器,想让它使用多线程,但遇到了一些问题。
这是原始代码的基本部分:
for i in range(0, 2000):
s = socket(AF_INET, SOCK_STREAM)
result = s.connect_ex((TargetIP, i))
if(result == 0) :
c = "Port %d: OPEN\n" % (i,)
s.close()
这个代码大约需要33分钟才能完成。所以我想用多线程来让它运行得快一点。这是我第一次做多线程的项目,所以也不是特别复杂。但是我运行了以下代码大约一个小时,既没有出现错误,也没有任何输出。我是在多线程方面做错了什么吗?
import threading
from socket import *
import time
a = 0
b = 0
c = ""
d = ""
def ScanLow():
global a
global c
for i in range(0, 1000):
s = socket(AF_INET, SOCK_STREAM)
result = s.connect_ex((TargetIP, i))
if(result == 0) :
c = "Port %d: OPEN\n" % (i,)
s.close()
a += 1
def ScanHigh():
global b
global d
for i in range(1001, 2000):
s = socket(AF_INET, SOCK_STREAM)
result = s.connect_ex((TargetIP, i))
if(result == 0) :
d = "Port %d: OPEN\n" % (i,)
s.close()
b += 1
Target = raw_input("Enter Host To Scan:")
TargetIP = gethostbyname(Target)
print "Start Scan On Host ", TargetIP
Start = time.time()
threading.Thread(target = ScanLow).start()
threading.Thread(target = ScanHigh).start()
e = a + b
while e < 2000:
f = raw_input()
End = time.time() - Start
print c
print d
print End
g = raw_input()
2 个回答
1
你现在的方法有点尴尬,用来监控线程。使用 join
可以知道线程什么时候完成。其实没有理由不多开几个线程,这样可以更快得到结果:
import threading
import socket
import time
ports = []
def check_port(ip,port):
s = socket.socket()
if s.connect_ex((ip,port)) == 0:
ports.append(port)
s.close()
target = raw_input('Target? ')
s = time.time()
threads = []
for port in range(2000):
t = threading.Thread(target=check_port,args=(target,port))
t.start()
threads.append(t)
for t in threads:
t.join()
print ports
print time.time() - s
输出
[80, 135, 445, 1028]
6.92199993134
5
这是你的代码出问题的地方。
threading.Thread(target = ScanLow).start()
threading.Thread(target = ScanHigh).start()
e = a + b
while e < 2000:
f = raw_input()
在你启动线程之后,你把值设置为 e
。但是之后你从来没有更新过 e
,所以循环就一直不会结束。
看起来你是想等两个线程都完成。其实可以用 join()
方法来更好地实现这个功能。
from threading import Thread
threads = []
threads.append(Thread(target = ScanLow))
threads.append(Thread(target = ScanHigh))
for thread in threads:
thread.start()
//both threads are running
for thread in threads:
thread.join()
//both threads have stopped
补充: 这和你的问题无关,但这是个有用的建议。你两个扫描函数做的事情完全一样。你可以用一个函数来替代它们,这个函数可以接收扫描范围作为参数,然后用这个函数启动两个线程。
from threading import Thread
def Scan(start, stop):
global a
global c
for i in range(start, stop):
s = socket(AF_INET, SOCK_STREAM)
result = s.connect_ex((TargetIP, i))
if(result == 0) :
c = "Port %d: OPEN\n" % (i,)
s.close()
a += 1
threadCount = 2
totalPorts = 2000
threads = []
for start in xrange(0, totalPorts, totalPorts/threadCount):
threads.append(Thread(target = Scan, args = (start, totalPorts/threadCount)))
for thread in threads:
thread.start()
//both threads are running
for thread in threads:
thread.join()
//both threads have stopped
这样你就可以很方便地调整线程和要扫描的端口数量了。