WINSOCK在网络测试编程中的使用

时间:2022-10-26 10:52:24

WINSOCK在网络测试编程中的使用

摘要:计算机网络技术已经飞速,越来越多的深入到各行各业中,对于网络应用技术的编程方法与技巧也广为大家了解和喜爱。本文通过对网络最基本的应用实例,阐述了WINSOCK在网络测试编程中的广泛应用。

关键词:计算机网络 WINSOCK 测试编程

中图分类号:TP393 文献标识码:A 文章编号:1007-9416(2012)08-0023-01

1、引言

当前在计算机应用中,Windows与网络已是最为广泛和不可缺少的应用。在Windows下的各种网络编程接口中,Windows Sockets越来越得到大家的重视,这是因为Windows Sockets规范是一套开放的、支持多种协议的Windows下的网络通信编程的API接口,也是Windws网络编程的事实标准,研究和开发在Windows下的网络编程技术具有普遍的应用价值。

本文通过对网络最基本的应用实例——网络测试程序的分析,使初学网络编程的人对Windows Sockets的使用有一个基本的了解。网络测试是网络编程中最基本的应用,用来测试与网络上另一个主机的网络连接是否正常。工作原理是:向网络上的另一个主机系统发送ICMP报文,如果指定系统得到了报文,它将把报文原样传回给发送者,发送者通过与原报文对比及发送和接收报文的时间差得知网络通讯的好坏。下面就测试网络的C++程序进行分析,来了解Windows Sockets的使用。

2、网络测试程序的原理

通过向测试机发送ICMP回应请求消息,并接收ICMP回应回复消息,通过这些消息来判断与主机的网络连通状况。

ICMP(Internet Control Message Protocol)即Internet控制消息协议(RFC-792),它是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 nId = 1;

static nSeq = 1;

int nRet;

//填写ICMP头部为响应请求

echoReq.icmpHdr.Type = ICMP_ECHOREQ;

echoReq.icmpHdr.Code = 0;

echoReq.icmpHdr.Checksum= 0;

echoReq.icmpHdr.ID = nId++;

echoReq.icmpHdr.Seq = nSeq++;

//置发送数据

for (nRet = 0; nRet < REQ_DATASIZE; nRet++)

echoReq.cData[nRet] = '' ''+nRet;

//记下发送的时间标记

echoReq.dwTime = GetTickCount();

//计算校验和

echoReq.icmpHdr.Checksum=in_cksum((u_short*)&echoReq,sizeof(ECHOREQUEST));

//发送响应请求ICMP

nRet = sendto(s, (LPSTR)&echoReq,sizeof(ECHOREQUEST),0,

(LPSOCKADDR)lpstToAddr,sizeof(SOCKADDR_IN));

if (nRet == SOCKET_ERROR)

ReportError("sendto()");

return (nRet);

}

运用WinSock的select(),来接收主机返回的数据包,

int WaitForEchoReply(SOCKET s) {

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() 可以完成非阻塞式即执行此函数时程序不必等待事件的发生,以返回值的不同来反映函数的执行情况,根据select()返回值,结合接收和发送数据的时间差,就可以知道网络的状态和通讯质量的好坏。

4、结语

Windows Sockets是Windows下开放的、支持多种协议的网络编程接口。提供给应用程序开发者一套简单的API,它包含了丰富的Windows扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程,实现网络通信的目的。

参考文献

[1]张晓明,陈明.计算机网络编程技术[M].北京:中国铁道出版社,2009,10.

[2]施炜.Windows Sockets 规范及应用[M].北京:电子工业出版社,1997.2.

[3]郑阿奇.Visual C++网络编程[M].北京:电子工业出版社,1997.2.

上一篇:基于EPON技术分析配网光通信的组网模式 下一篇:企业信息化中的计算机信息技术的应用