龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

用VC++ 6.0制作网络自动测试程序(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
WSAStartup(MAKEWORD(2,1),wsaData) ; sockRaw = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP); setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO, (char*)timeout,sizeof(timeout) ); memset(dest,0,sizeof(dest)); dest.sin

WSAStartup(MAKEWORD(2,1),&wsaData) ;
sockRaw = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP); 
setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,
(char*)&timeout,sizeof(timeout) );
memset(&dest,0,sizeof(dest)); 
dest.sin_family = AF_INET;
dest.sin_addr.s_addr= inet_addr(szDestHost); 
memset(icmp_data,0,sizeof(icmp_data)); //clear icmp_data.
((IcmpHeader*)icmp_data)->i_type = 8; //ICMP_ECHO
((IcmpHeader*)icmp_data)->i_code = 0;
((IcmpHeader*)icmp_data)->i_id = (u_short)GetCurrentProcessId();
((IcmpHeader*)icmp_data)->i_seq = 0;
  
for(int k=0; k

((IcmpHeader*)icmp_data)->i_cksum = 0; 
((IcmpHeader*)icmp_data)->i_seq ++;
((IcmpHeader*)icmp_data)->i_cksum=checksum((u_short*)icmp_data,8); 
sendto(sockRaw,icmp_data,8,0,(struct sockaddr*)&dest,sizeof(dest)); 
int bread=recvfrom(sockRaw,recvbuf,1024,0,(struct sockaddr*)&from,
&fromlen);
if (bread == SOCKET_ERROR){
if(k==Ktest-1) goto ERR1 ; 
else continue; //try again(3 times)


return TRUE; //no erros.
ERR1:
closesocket (sockRaw); 
sockRaw= INVALID_SOCKET; 
WSACleanup();
return FALSE; 
}

为简洁起见,源码中大部分的出错处理语句都删去了。整个函数执行的过程如下:

(1)用WSAStartup()函数初始化WINSOCK DLL。

(2)用socket()函数建立一个原始套接字sockRaw。

(3)用setsockopt()函数来设置套接字的选择项。这里用SO_RCVTIMEO参数来设置接收超时。超时值由timeout=1000设定超时最长时间为1秒钟。

(4)给被测节点的dest和Icmpheader结构变量赋值。其中szDestHost放被测节点的IP地址(点间隔格式),inet_addr()函数将一个点间隔的地址转换成4字节的地址;Icmpheader结构的i_type=8表示发送一个请求响应数据包(ICMP_ECHO),i_id为数据包的标识,i_cksum为数据包的校验和,i_seq用来为发送包计数。

(5)用sendto()函数向被测节点发送信息,用recvfrom()函数接收被测节点的应答信息。若在规定时间内(1秒)收不到应答信息,再连测2次。若3次的发送均收不到应答信息,可认为网络故障。Ktest的值决定对被测节点反复测试的次数。(当收到应答信息时,还认应检查应答信息内容正确后,才认为网络正常。本例略去这些检查似乎也无妨)。

(6)测试完一个节点后,用closesocket()函数关闭套接字,用WSAcCleanup()函数释放为应用程序分配的资源。

至此,就可以编译和执行程序,体会个中乐趣。

精彩图集

赞助商链接