计算机网络课程设计— —端口扫描程序

设计内容

编写一端口扫描程序,能够显示某段IP地址范围内中计算机的哪些端口处于工作状态。

设计要求

  1. 选取以下方法实现端口扫描:TCP connect()扫描、TCP SYN扫描和TCP FIN扫描。
  2. 实现程序应为图形化界面,可以设置待扫描的IP地址的范围、端口范围、扫描次数和超时设置,并能将扫描的结果按照表格的形式展示出来,展示的结果包括IP地址、端口号。
  3. 需要提供扫描进度条,提示用户扫描任务已完成的百分比。需要提供暂停按钮和停止按钮。
  4. 定义数据结构
需要定义好相关的数据结构
  5. 要求有详细的说明文档,包括程序的设计**、工作流程、关键问题等。
  6. 编程语言不限。

设计思路

  1. 采用 TCP connect() 方法进行扫描。
  2. 图形化界面采用 PyQt5 库,用 Qt Designer 进行界面布局与设计,用PyUIC 将设计完成的 .ui文件,转成对应的.py文件。

关键问题与解决办法

扫描效率

使用多线程来完成扫描任务,经测试,开 200 个线程体验最佳。

当执行扫描任务时,界面假死

这是由于在主线程运行需较长时间的任务时,需等待任务运行结束,界面才会响应。 解决办法:使用信号与槽(signal & slot)机制,将信号与相应的槽进行绑定,也就是绑定回调。当需要 UI 界面作出响应时,线程发出信号,调用对应的回调。

线程的暂停、继续与结束

采用 Python 多线程内置的通信机制 Threading.Event,这个标示符可以通过set()方法设为True,通过clear()方法重新设为False, wait()方法则使线程一直处于阻塞状态,直到标示符变为True。也就是说我们可以通过 以上三种方法来多个控制线程的行为。

临界资源的保护

采用信号量机制,使用方法如下:

  1. 创建信号量
  2. 等待获得并占有信号量
  3. 释放信号量
import threading
printLock = threading.Semaphore(1)
if printLock.acquire():
    # Do Something
    printLock.release()