前言
上文中已经实现获取范围中所有的IP+端口,这里实现使用多线程进行扫描调用
系列
Python多线程扫描主机 一 UI实现和展示_shaynerain的博客-CSDN博客
Python多线程扫描主机 二 范围IP&端口的扫描-CSDN博客
Python多线程扫描主机 三 范围IP&端口的扫描-CSDN博客
多线程实现
首先需要明确,电脑中线程数量不能可能无限大,所以直接创建对应IP数量个数的线程不太现实,这里直接使用线程池来进行管理,线程池可以很好的管理线程,结束后,后面排队的自动开启,代码实现如下:
def scan_fun(self, max, ips):
"""
线程管理线程池方法
:param max: 最大线程数
:param ips: IP列表
:return:
"""
# 创建线程池
with ThreadPoolExecutor(max_workers=max) as pool:
# 传入调用的方法,和参数
pool.map(self.scan_action, ips)
# 提示完成
print("完成")
pass
def scan_action(self, ip_port):
"""
扫描方法
:param ip_port:一个IP+端口
:return:
"""
# 拆分下IP和port
ip, port = ip_port
# 调用方法赛秒
if scan(ip, port):
# 这里扫描完成后索引值+1,这里需要线程锁,防止线程同时访问该值
self.thread_lock.locked()
# +1
self.thread_index += 1
# 提交进度
self.thread_signal.emit({'progress': self.thread_index, "ip": "{}:{}".format(ip, port)})
# 释放
self.thread_lock.release()
else:
# 上锁
self.thread_lock.locked()
# +1
self.thread_index += 1
# 提交出去
self.thread_signal.emit({'progress': self.thread_index, "ip": None})
# 释放锁
self.thread_lock.release()
解释一下:
第一个函数便是线程池进行管理,需要传入方法和参数
第二个函数是调用扫描方法,并且使用线程锁,来逐一增加进度,防止多个线程之间调用冲突
完整成品的exe下载连接
https://download.csdn.net/download/shaynerain/88383175
如果需要获取源码可点击里面的帮助,或者是访问如下连接
from: