1.原理
前面原理篇有讲过,开放的TCP端口会等待客户端connect自己,所以我的客户端程序connect目标端口,根据返回值得不同判断对方是否开放了监听端口(connec()返回-1说明连接失败,则端口关闭;否则,成功,说明端口开放),扫面时间会比其他方式长,因为对于失败的端口不止connect一次。
2.实现方式及遇到的的问题
前面架构篇有讲过,每个扫描线程(tcpConScanPort)会建立一个线程池,对每个要扫描的端口都创建一个线程tcpConScanEach(线程配置成detach属性)。tcpConScanEach负责connect各自的端口,将结果存在全局的一个链表中。
(1)参数传递
这里需要给每个端口扫描线程传递的参数包括目的ip和端口,在主端口扫面线程中,我为每一个要扫描的端口动态分配一个sockaddr_in类型的空间,将指向该空间的指针传向每一个子线程,子线程connect完成后释放这个空间。