Python端口扫描程序,如何确定最佳线程数

2024-06-16 11:31:27 发布

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

我有一个多线程Python端口扫描器,循环中的每个线程从一个公共队列中获取一些东西(一个IP地址/端口对),对它做一些工作(连接、握手并获取服务器的版本),然后再次循环。你知道吗

下面是一些部分代码:

import threading, queue, multiprocessing

class ScanProcess(multiprocessing.Process):
    threads = []

    def __init__(self, squeue, dqueue, count):
        self.squeue = squeue
        self.dqueue = dqueue
        self.count = count
        self._init_threads()
        super(ScanProcess, self).__init__()

    def _init_threads(self):
        self.threads = [ScanThread(self.squeue, self.dqueue) for _ in range(0, self.count)]

    def _start_threads(self):
        for thread in self.threads:
            thread.start()

    def _join_threads(self):
        for thread in self.threads:
            thread.join()

    def run(self):
        self._start_threads()
        self._join_threads()

class ScanThread(threading.Thread):
    def __init__(self, squeue, dqueue):
        self.squeue = squeue
        self.dqueue = dqueue
        super(ScanThread, self).__init__()

    def run(self):
        while not self.squeue.empty():
            try:
                target = self.squeue.get(block=False)
                # do the actual work then put the result in dqueue
            except queue.Empty:
                continue

# how many threads/processes
process_count = 2
thread_count = 10

# load tasks from file or network and fill the queues
squeue = multiprocessing.Queue()
dqueue = multiprocessing.Queue()

# create and start everything
processes = [ScanProcess(squeue, dqueue, thread_count) for _ in range(0, process_count)]

for process in processes:
    process.start()

for process in processes:
    process.join()

# enjoy the show!

我遇到的问题是线程数目前是手动设置的。我想设置它自动饱和网络连接,同时不丢弃数据包,但我不知道如何开始实施。有人能总结一下nmap/zmap是如何做到的吗?你知道吗

感谢您的帮助。你知道吗


Tags: theinselfforinitdefcountmultiprocessing