AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

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

51自学网 2015-08-30 http://www.wanshiok.com

 

  本程序设计为每10分钟对网络作一次自动测试。所以第一条语句须检查定时器中断是否已够20次(30秒*20=10分钟)。若够的话,就关断定时器,循环调用Autotest()对所有网络节点进行测试。若Autotest()的返回值为FALSE,说明该节点有问题,随即调用对应声波文件发出不停的报警声。在报警的同时,程序继续往下运行,作余下网络节点的测试。若所有节点均正常,则调用BIRD0.WAV声波文件发出动听的鸟鸣声。全部节点测试完后,才用SetTimer()再次启动定时器。

  报警声波文件的制作,可在WINDOWS的附件à娱乐à录音机,通过麦克风录下报警语音。按照在INFO.INI文件中各节点的顺序,将语音文件分别存为ERR1.WAV,ERR2.WAV……。这样,网络节点的报警声就能和出错节点正确对应。

  测试时,若有2个以上网络节点有问题,前一个出错节点只会报警一次,最后一个出错节点则会发出循环报警声。为了便于用户观察出错情况,用InvertRgn()来反相显示出错节点的区域。InvalidateRect(NULL)函数用来使屏幕刷新,以便下一次测试的观察。

三、AUTOP.CPP的源码及说明

AUTO.CPP的源码如下:

//#include 头文件略

. . . . . . . . . . .

typedef struct _ihdr {

BYTE i_type, i_code;

u_short i_cksum,i_id, i_seq;

}IcmpHeader;

struct sockaddr_in saDestAddr;

CString Messtr,Tmpstr;

 

u_short checksum(u_short *buffer, int size) {

. . . . . . .(略)

}

 

BOOL Autotest(char far * szDestHost,int Ktest)

{

  WSADATA wsaData;

  SOCKET sockRaw;

  struct sockaddr_in dest,from;

  char icmp_data[10], recvbuf[100];

  unsigned int addr=0;

  int fromlen = sizeof(from);

int timeout = 1000; //ms

 

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()函数释放为应用程序分配的资源。

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

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:MFC如何封装WINDOWS应用程序的流程  下一篇:VxD编程入门教程