bsp;
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()函数释放为应用
程序分配的资源。
至此,就可以编译和执行
程序,体会个中乐趣。