一.概述
该程序在linux下用c语言实现TCP的三种端口扫描方式(connect、SYN、FIN)和UDP端口扫描;我用一个函数数组存放四个实现函数,根据选择的端口扫描方式,在创建线程的时候选择不同的函数来执行,主线程挂起等待扫描线程结束,最后打印开放的端口。我用一个全局的队列来存放存在的指针,链表实现。除了connect方式,其它的方式需要知道源主机的ip,因此在创建扫描线程之前,先获得本机的ip地址,作为参数传给扫描线程。
每个扫描线程(tcpXXXScanPort)会建立一个线程池,对每个要扫描的端口都创建一个线程tcpXXXScanEach(线程配置成detach属性),具体的实现每种方式有些差别,后几篇会讲到。
二.实现过程
1.数据结构
由于调用线程只能传递一个参数,所以我把要传递的信息放在一个数据结构里面,用指针传给子线程。以下是自己定义的要传递的数据结构和全局变量。
#include "mysock.h"
#include "ping.h"
#include "tcpConScan.h"
#include "tcpSynScan.h"
#include "tcpFinScan.h"
#include "udpIcmpScan.h"
int main(int argc, char *argv[])
{
char destIPStr[] = "192.168.1.21";
char port1Str[] = "4000";//扫描的初始端口
char port2Str[] = "4010";//扫描的结束端口
int cmd;
struct ScanSock s;
cmd = 4;//扫描方式
s.portStart = atoi(port1Str);
s.portEnd = atoi(port2Str);
strncpy(s.destIP, destIPStr, sizeof(destI