
数事其术与变用
WINSOCK在网络测试编程中的使用
刘端黄元李顺利
(驻马店市气象局河南驻马店463000)
通信技术
摘要:计算机网络技术已经飞违,越来越多的深入到各行各业中,对于网络应用技术的编程方法与技巧电广为大家了解和喜爱。本文通过对网络最基本的应用实例,期速了WINSOCK在网络测试端程中的广泛应用。
关键调:计算机网络WINSOCK测试端程
中图分类号:TP393 1、引言
文献标识码:A
文章编号:1007-9416(2012)08-0023-01
echoReq.icmpHdr.Type
ICMP_ECHOREQ;
当前在计算机应用中,Windows与网络已是最为广泛和不可缺少的应用,在windows下的各种网络编程接口中,windows Sockets越来越得到大家的重视,这是因为WindowsSockets规范是一套开放的,支持多种协议的Windows下的网络通信编程的API 接口,也是Windws网络编程的事实标准,研究和开发在Windows 下的网络编程技术具有普邀的应用价值。
网络测试程序的分析
本文通过对网络最基本的应用实例
使初学网络编程的人对Windows Sockets的使用有一个基本的了解。网络测试是网络编程中最基本的应用,用来测试与网络上另一个主机的网络连接是否正常。工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文原样传回给发送者,发送者通过与原报文对比及发送和接收报文的时间差得知网络通讯的好坏。下面就测试网络的C++程序进行分析,来了
解WindowsSockets的使用。 2、网络测试程序的原理
通过向测试机发送ICMP回应请求消息,并接收ICMP回应回复消息,通过这些消息来判断与主机的网络连通状况
ICMP(Internet Control Message Protocol)即Internet控制消息协议(RFC792),它是TCP/IP协议集中的一个子协议,属于网络层协议。应用中,它使用IP做为底层支持,但ICMP不是高层切议,而是IP层的协议,通常ICMP报文被IP层或更高层协议(TCP或 UDP)使用,每一种IP模块必须实现ICMP。ICMP报文有两种类型, ICMP错误报告报文和ICMP查询报文,每个ICMP报头均包含类型编码和校验,其余选项则随ICMP的功能不同面不同。这里只使用 ICMP报文中的两种:请求回送和请求回应。
网络测试程序发送ICMP回应请求消息并记录收到ICMP回应回复消息,通过这些消息作为测试网络或主机是否正常的一个依据。 3、网络测试程序分析
要使用WinSock在程序开始应有#include
,程序开始用WSAStartup(wVer,&wsaData)对WinSock进行初始化其中wVer是WinSock需要的版本号,wsaData通过WSADATA wsaData定义,然后创建一个SOCK个例rawSocket:
SOCKET rawSocket=socket(AF_INET.SOCK_RAW, IPPROTO_ICMP),
如果rawSocket不是SOCKET_ERROR,说明创建成功,就可以使用此Sock了,把ICMP设为请求回送方式(ICMP_ECHOREQ),填充当前时间及其它项目,其中校验和使用网际校验和算法,把被校验的数据16位进行累加,然后取反码,若数据字节长度为奇数,则数据尾部补一个字节的0以凑成偶数。
向要测试主机的IP地址发送ICMP包,发送程序如下:
int SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr){
static ECHOREQUEST echoReq
static nld = 1, static nSeq = 1; int nRet;
//填写ICMP头部为响应请求
echoReq.icmpHdr. Code
echoReq.icmpHdr. Checksum= 0, echoReq.icmpHdr,ID
echoReq-icmpHdr, Seq//置发送数据
0 =
= nld++;
= nSeq++;
for (nRet = 0, nRet < REQ_DATASIZE, nRet++)
+nRet;
echoReq.cData[nRet] =
//记下发的时间标记 echoReq.dwTime =
//计算校验和
GetTick Count()
echoReq.icmpHdr.Checksum=in_cksum((u_short+)&echoReq, sizeof(ECHOREQUEST),
//发送响应请求ICMP
nRet = sendto(s,
(LPSTR)&echoReq,sizeof
(ECHOREQUEST).0,
(LPSOCKADDR)IpstToAddr , sizeof(SOCKADDR_IN);
if (nRet == SOCKET_ERROR)
ReportError("sendtoO"); return (nRet);
运用WinSock的select(),来接收主机返回的数据包,
WaitForEchoReply(SOCKET s) int
struct timeval Timeout; fd_set readfds;
readfds.fd_count = 1, readfds.fd_array[0] = s, Timeout,tv_sec = 5, Timeout.tv_usec = 0,
return(select(1, &readfds, NULL, NULL, &Timeout) Timeout是超时时间,它有两个长整字段,秒和微秒,超过该设
定值返回0。select()可以完成非阻塞式即执行此函数时程序不必等待事件的发生,以返回值的不同来反映函数的执行情况,根据 selectO返回值,结合接收和发送数据的时间差,就可以知道网络的
状态和通讯质量的好坏。 4、结语
WindowsSockets是Windows下开放的.支持多种协议的网络编程接口。提供给应用程序开发者一套简单的API,它包含了丰富的Windows扩展库函数,以使程序员能充分地利用Windows消
息驱动机制进行编程,实现网络通信的目的。参考文献
[1]张晚明.陈明.计算机网络编程技术[M].北京:中国铁道出版社, 2009,10.
[2]施炜.Windows Sockets规范及应用[M].北京:电子工业出版社, 1997.2
[3]郑阿奇.Visua1C++网络编程[M].北京:电子工业出版社,1997.2.
作者简介:刘端:(1983.5一),男,汉族,籍贯:河南泌阳,本科,工学学士,网络工程专业,现驻马店市气象局从事通信网络装备保障工作