파이썬으로 간단한 portscanner를 구현하려고합니다. 대기열에서 제공되는 포트를 스캔하는 여러 작업자 스레드를 작성하여 작동합니다. 결과를 다른 큐에 저장합니다. 모든 포트를 검사하면 스레드와 응용 프로그램이 종료됩니다. 그리고 여기에 문제가 있습니다. 포트 수가 적 으면 모든 것이 잘 작동하지만 200 개 이상의 포트를 스캔하려고하면 응용 프로그램이 교착 상태에 빠지게됩니다. 왜 그런지 모르겠습니다.Python 스레드에서 교착 상태가 발생했습니다.
class ConnectScan(threading.Thread):
def __init__(self, to_scan, scanned):
threading.Thread.__init__(self)
self.to_scan = to_scan
self.scanned = scanned
def run(self):
while True:
try:
host, port = self.to_scan.get()
except Queue.Empty:
break
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((host, port))
s.close()
self.scanned.put((host, port, 'open'))
except socket.error:
self.scanned.put((host, port, 'closed'))
self.to_scan.task_done()
class ConnectScanner(object):
def scan(self, host, port_from, port_to):
to_scan = Queue.Queue()
scanned = Queue.Queue()
for port in range(port_from, port_to + 1):
to_scan.put((host, port))
for i in range(20):
ConnectScan(to_scan, scanned).start()
to_scan.join()
아무도 틀렸을 수도 있습니다. 또한 파이썬에서 이러한 스레딩 문제를 디버깅하는 방법에 대해 알아 보겠습니다.
맞습니다. tast_done이 자주 자주 불리지 않았습니다. 그 이유는 필터링 된 포트에 연결하려고 시도하면 (즉, 응답을받지 못하기 때문에) 소켓이 예외를 throw하지 않고 영원히 기다릴 수 있기 때문입니다. 그건 내 교착 상태 였어. – j0ker