XP风格 (#绿色风格)
.子程序 _窗口_扫描配置_将被销毁
结束 ()
.子程序 _按钮_退出_被单击
结束 ()
.子程序 _按钮_关于_被单击
.子程序 _IP编辑框_起始IP_地址被改变
.局部变量 _IP, 文本型, , "0"
_IP = 分割文本 (IP编辑框_起始IP.地址, “.”, )
.如果真 (取数组成员数 (_IP) ≠ 4)
返回 ()
.如果真结束
IP编辑框_终止IP.地址 = _IP [1] + “.” + _IP [2] + “.” + _IP [3] + “.” + “255”
.子程序 _按钮_扫描_被单击
.局部变量 _任务分发守护句柄, 整数型, 静态
.如果真 (按钮_扫描.标题 = “停止”)
强制结束线程 (_任务分发守护句柄)
关闭线程句柄 (_任务分发守护句柄)
_任务分发守护句柄 = 0
扫描结束 = 真
按钮_扫描.标题 = “扫描”
返回 ()
.如果真结束
.如果真 (检查IP合法性 () = 假)
返回 ()
.如果真结束
.如果真 (检查端口合法性 () = 假)
返回 ()
.如果真结束
.如果真 (信息框 (“共有” + 到文本 (分解IP地址 ()) + “条IP地址,是否继续?”, #是否钮 + #默认按钮二, ) = #否钮)
清除数组 (IP数组)
返回 ()
.如果真结束
.如果真 (信息框 (“共有” + 到文本 (分解端口号 ()) + “个端口号,是否继续?”, #是否钮 + #默认按钮二, ) = #否钮)
清除数组 (端口数组)
返回 ()
.如果真结束
超时 = 到整数 (编辑框_超时.内容)
重定义数组 (线程池, 假, 到整数 (编辑框_线程数.内容))
扫描结束 = 假
启动线程 (&线程超时结束守护, , )
启动线程 (&任务分发守护, , _任务分发守护句柄)
按钮_扫描.标题 = “停止”
.子程序 检查IP合法性, 逻辑型
.局部变量 _IP1, 文本型, , "0"
.局部变量 _IP2, 文本型, , "0"
_IP1 = 分割文本 (IP编辑框_起始IP.地址, “.”, )
_IP2 = 分割文本 (IP编辑框_终止IP.地址, “.”, )
.如果真 (取数组成员数 (_IP1) ≠ 4 或 取数组成员数 (_IP2) ≠ 4)
信息框 (“未填写IP”, 0, )
返回 (假)
.如果真结束
.如果真 (_IP1 [1] = “0” 或 _IP2 [1] = “0”)
信息框 (“IP地址不合法”, 0, )
返回 (假)
.如果真结束
.如果真 (_IP1 [4] = “0”)
信息框 (IP编辑框_起始IP.地址 + “的最后一位应该从1开始”, 0, )
返回 (假)
.如果真结束
.如果真 (到整数 (_IP1 [1]) > 到整数 (_IP2 [1]))
信息框 (“终止IP不能小于开始IP”, 0, )
返回 (假)
.如果真结束
.如果真 (到整数 (_IP1 [1]) = 到整数 (_IP2 [1]) 且 到整数 (_IP1 [2]) > 到整数 (_IP2 [2]))
信息框 (“终止IP不能小于开始IP”, 0, )
返回 (假)
.如果真结束
.如果真 (到整数 (_IP1 [1]) = 到整数 (_IP2 [1]) 且 到整数 (_IP1 [2]) = 到整数 (_IP2 [2]) 且 到整数 (_IP1 [3]) > 到整数 (_IP2 [3]))
信息框 (“终止IP不能小于开始IP”, 0, )
返回 (假)
.如果真结束
.如果真 (到整数 (_IP1 [1]) = 到整数 (_IP2 [1]) 且 到整数 (_IP1 [2]) = 到整数 (_IP2 [2]) 且 到整数 (_IP1 [3]) = 到整数 (_IP2 [3]) 且 到整数 (_IP1 [4]) > 到整数 (_IP2 [4]))
信息框 (“终止IP不能小于开始IP”, 0, )
返回 (假)
.如果真结束
返回 (真)
.子程序 检查端口合法性, 逻辑型
.局部变量 _哈希表, 文本型
.局部变量 _计次, 整数型
.局部变量 _端口, 文本型
.如果真 (编辑框_端口号.内容 = “”)
信息框 (“请填写要扫描的端口号”, 0, )
编辑框_端口号.内容 = “21,80,440-445,3389”
返回 (假)
.如果真结束
_哈希表 = “1234567890,-”
_端口 = 编辑框_端口号.内容
.计次循环首 (取文本长度 (_哈希表), _计次)
_端口 = 子文本替换 (_端口, 取文本中间 (_哈希表, _计次, 1), , , , 真)
.计次循环尾 ()
.如果真 (_端口 ≠ “”)
信息框 (“扫描端口中只能包含数字、英文逗号和英文减号”, 0, )
返回 (假)
.如果真结束
返回 (真)
.子程序 分解IP地址, 整数型
.局部变量 _IP1, 文本型, , "0"
.局部变量 _IP2, 文本型, , "0"
_IP1 = 分割文本 (IP编辑框_起始IP.地址, “.”, )
_IP2 = 分割文本 (IP编辑框_终止IP.地址, “.”, )
清除数组 (IP数组)
.判断循环首 (真)
加入成员 (IP数组, _IP1 [1] + “.” + _IP1 [2] + “.” + _IP1 [3] + “.” + _IP1 [4])
.如果真 (_IP1 [1] + _IP1 [2] + _IP1 [3] + _IP1 [4] = _IP2 [1] + _IP2 [2] + _IP2 [3] + _IP2 [4])
跳出循环 ()
.如果真结束
_IP1 [4] = 到文本 (到整数 (_IP1 [4]) + 1)
.如果真 (到整数 (_IP1 [4]) > 255)
_IP1 [4] = “1”
_IP1 [3] = 到文本 (到整数 (_IP1 [3]) + 1)
.如果真 (到整数 (_IP1 [3]) > 255)
_IP1 [3] = “0”
_IP1 [2] = 到文本 (到整数 (_IP1 [2]) + 1)
.如果真 (到整数 (_IP1 [2]) > 255)
_IP1 [2] = “0”
_IP1 [1] = 到文本 (到整数 (_IP1 [1]) + 1)
.如果真结束
.如果真结束
.如果真结束
.判断循环尾 ()
返回 (取数组成员数 (IP数组))
.子程序 分解端口号, 整数型
.局部变量 _端口, 文本型, , "0"
.局部变量 _计次, 整数型
.局部变量 _临时文本数组, 文本型, , "0"
清除数组 (端口数组)
.如果 (寻找文本 (编辑框_端口号.内容, “,”, , 假) ≠ -1)
_端口 = 分割文本 (编辑框_端口号.内容, “,”, )
.否则
加入成员 (_端口, 编辑框_端口号.内容)
.如果结束
.计次循环首 (取数组成员数 (_端口), _计次)
.如果 (寻找文本 (_端口 [_计次], “-”, , 假) ≠ -1)
_临时文本数组 = 分割文本 (_端口 [_计次], “-”, )
.如果真 (取数组成员数 (_临时文本数组) < 2)
到循环尾 ()
.如果真结束
.循环判断首 ()
.如果真 (_临时文本数组 [1] ≠ “” 且 _临时文本数组 [1] ≠ “0” 且 到整数 (_临时文本数组 [1]) < 65535)
加入成员 (端口数组, 到整数 (_临时文本数组 [1]))
.如果真结束
_临时文本数组 [1] = 到文本 (到整数 (_临时文本数组 [1]) + 1)
.循环判断尾 (到整数 (_临时文本数组 [1]) ≤ 到整数 (_临时文本数组 [2]))
.否则
.如果真 (_端口 [_计次] ≠ “” 且 _端口 [_计次] ≠ “0” 且 到整数 (_端口 [_计次]) < 65535)
加入成员 (端口数组, 到整数 (_端口 [_计次]))
.如果真结束
.如果结束
.计次循环尾 ()
返回 (取数组成员数 (端口数组))
.子程序 线程超时结束守护
.局部变量 _线程索引, 整数型
.局部变量 _超时, 整数型
.判断循环首 (真)
_线程索引 = 查找超时线程 ()
.如果真 (_线程索引 = -1 且 扫描结束)
跳出循环 ()
.如果真结束
.如果真 (_线程索引 > 0)
强制结束线程 (线程池 [_线程索引].线程句柄)
关闭线程句柄 (线程池 [_线程索引].线程句柄)
线程池 [_线程索引].IP = “”
线程池 [_线程索引].端口 = 0
线程池 [_线程索引].启动时间 = 0
线程池 [_线程索引].线程句柄 = 0
_超时 = _超时 + 1
.如果真结束
.判断循环尾 ()
列表框_结果.加入项目 (“共启动” + 到文本 (进度条1.位置) + “条线程,超时” + 到文本 (_超时) + “条”, 0)
.子程序 任务分发守护
.局部变量 _计次, 整数型
.局部变量 _线程索引, 整数型
.局部变量 _计数, 整数型
.局部变量 _IP数, 整数型
.局部变量 _端口数, 整数型
_IP数 = 取数组成员数 (IP数组)
_端口数 = 取数组成员数 (端口数组)
进度条1.最大位置 = _IP数 × _端口数
.计次循环首 (_IP数, _计次)
.计次循环首 (_端口数, _计数)
.循环判断首 ()
_线程索引 = 查找空闲线程 ()
.循环判断尾 (_线程索引 = 0)
线程池 [_线程索引].IP = IP数组 [_计次]
线程池 [_线程索引].端口 = 端口数组 [_计数]
.如果 (单选框_TCP.选中)
启动线程 (&TCP扫描线程, _线程索引, 线程池 [_线程索引].线程句柄)
.否则
启动线程 (&UDP扫描线程, _线程索引, 线程池 [_线程索引].线程句柄)
.如果结束
线程池 [_线程索引].启动时间 = 取启动时间 ()
进度条1.位置 = _计次 × _端口数
.计次循环尾 ()
.计次循环尾 ()
扫描结束 = 真
.子程序 查找空闲线程, 整数型
.局部变量 _计次, 整数型
.计次循环首 (取数组成员数 (线程池), _计次)
.如果真 (线程池 [_计次].启动时间 = 0)
返回 (_计次)
.如果真结束
.计次循环尾 ()
返回 (0)
.子程序 查找超时线程, 整数型, , 返回0没有超时,返回-1没有运行的线程
.局部变量 _计次, 整数型
.局部变量 _标记, 逻辑型
.计次循环首 (取数组成员数 (线程池), _计次)
.如果真 (线程池 [_计次].启动时间 ≠ 0)
_标记 = 真
.如果真 (取启动时间 () - 线程池 [_计次].启动时间 > 超时)
返回 (_计次)
.如果真结束
.如果真结束
.计次循环尾 ()
.如果 (_标记)
返回 (0)
.否则
返回 (-1)
.如果结束
.子程序 TCP扫描线程
.参数 线程池索引, 整数型
.局部变量 _TCP连接, 网络客户端
.如果真 (_TCP连接.连接 (线程池 [线程池索引].IP, 线程池 [线程池索引].端口))
列表框_结果.加入项目 (“[TCP]” + 线程池 [线程池索引].IP + “:” + 到文本 (线程池 [线程池索引].端口), 1)
列表框_结果.置顶端可见项目 (列表框_结果.取项目数 () - 1)
.如果真结束
_TCP连接.断开 ()
线程池 [线程池索引].IP = “”
线程池 [线程池索引].端口 = 0
线程池 [线程池索引].启动时间 = 0
线程池 [线程池索引].线程句柄 = 0
.子程序 UDP扫描线程
.参数 线程池索引