tcp端口扫描及tcp服务器搭建
使用Socket之前必须使用WSAStarup函数。该函数的第一个参数wVersionRequested:一个WORD(双字节)型数值,指定了应用程序需要使用的Winsock规范的最高版本 ;第二个参数lpWSAData: 指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。函数执行成功后返回0.
WSACleanup函数: int WSACleanup(void);
程序在完成对请求的Socket库的使用后,要调用WSACleanup函树来解除与Socket库的绑定并且释放Socket库所占用的系统资源。
b) 随机端口的产生
本函数以时间作为参数生成随机数种子,本设计中在1-30中取随机数,随机数依次存储在数组中,在每一次生成随机数后都与之前的生成的随机数比较,出现重复则继续生成随即数,直至随机数生成完毕。
随机数生成完后在扫描模块处调用,每进行一次扫描的循环取一个随机数,这样既可实现随机端口的扫描。具体的实现代码如下:
/*----------------------随机端口的生成-----------------------*/ int x; int i,j; int num[30];//声明数组 srand( (unsigned)time(NULL) ); for(i=0;i<30;i++) {leap: x=rand()%100%30; for(j=0;j<i;j++) { if(x==num[j]) goto leap; } num[i]=x; }
/*----------------------end_random----------------------------*/
c) 实现端口扫描
本课程设计端口扫描部分主要调用了由操作系统提供的Connect()函数,这是最基本的TCP扫描。Connect()函数用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,我们可以通过同时打开多个套接字,从而加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快的使它关闭。
d) 通信模块的实现