编写一端口扫描程序,能够显示某段IP地址范围内中计算机的哪些端口处于工作状态。
- 选取以下方法实现端口扫描:TCP connect()扫描、TCP SYN扫描和TCP FIN扫描。
- 实现程序应为图形化界面,可以设置待扫描的IP地址的范围、端口范围、扫描次数和超时设置,并能将扫描的结果按照表格的形式展示出来,展示的结果包括IP地址、端口号。
- 需要提供扫描进度条,提示用户扫描任务已完成的百分比。需要提供暂停按钮和停止按钮。
- 定义数据结构 需要定义好相关的数据结构
- 要求有详细的说明文档,包括程序的设计**、工作流程、关键问题等。
- 编程语言不限。
- 采用 TCP connect() 方法进行扫描。
- 图形化界面采用 PyQt5 库,用 Qt Designer 进行界面布局与设计,用PyUIC 将设计完成的
.ui
文件,转成对应的.py
文件。
使用多线程来完成扫描任务,经测试,开 200 个线程体验最佳。
这是由于在主线程运行需较长时间的任务时,需等待任务运行结束,界面才会响应。 解决办法:使用信号与槽(signal & slot)机制,将信号与相应的槽进行绑定,也就是绑定回调。当需要 UI 界面作出响应时,线程发出信号,调用对应的回调。
采用 Python 多线程内置的通信机制 Threading.Event
,这个标示符可以通过set()
方法设为True,通过clear()
方法重新设为False,
wait()
方法则使线程一直处于阻塞状态,直到标示符变为True。也就是说我们可以通过 以上三种方法来多个控制线程的行为。
采用信号量机制,使用方法如下:
- 创建信号量
- 等待获得并占有信号量
- 释放信号量
import threading
printLock = threading.Semaphore(1)
if printLock.acquire():
# Do Something
printLock.release()