技术开发 频道

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


【IT168技术文档】

  由MICROSOFT公司开发的WINDOWS SOCKETS提供了WINDOWS环境下网络通讯的编程接口。在VC++6.0中,可以通过调用WINDOWS SOCKETS函数,采用原始套接字(RAW SOCKETS)类型和互连网控制消息协议(ICMP),来编制一个能实现PING功能的函数。通过定时调用该函数,就可实现网络的自动测试。若再加上语音报警功能,就是一个很实用的网络测试程序。本文拟介绍实现此功能的程序的制作方法。

  为便于说明起见,我们还是按“用VC++6.0制作网络测试程序”一文介绍的方法,先做一个简单的网络测试程序(Netest)。注意,在制作 Netest工程的STEP 4 OF 6时 ,要钩选WINDOWS SOCKETS选项。否则,在下面要编译AUTOP.CPP文件时,将会出错。在Netest工程编译成功后,再做以下几项工作:

  一、增加AUTOP. CPP到工程文件中
  在工程à添加工程à文件à将AUTOP.CPP添加到当前工程文件中(AUTOP.CPP的源码见下面第三节的内容所示,应事先将其COPY到当前工程的目录中)。

  二、在工程中增加自动测试的有关菜单和函数

  (1)在“用VC++6.0制作网络测试程序”一文介绍的Netest工程中,其Readinfo()函数的最后一条语句GlobalFree (hHost)释放了装载有初始化信息的内存,当随后调用PING.EXE时,问题不是很大。但若调用WINSOCK函数,内存中的初始化信息会被冲掉。所以须将该语句移到程序结束处再执行。可如下增加OnDestroy()函数:
  在ClassWizard中,对应Class name=CNetestView, Object IDs= CNetestView,Message =WM_DESTROY,点击Add FunctionàOnDestroyàEdit Code,增加相应代码如下:
void CNtestView::OnDestroy() { CFormView::OnDestroy(); GlobalFree(hHost); //从Readinfo()移到此 for (int i=0; i }
  (2)增加自动测试菜单Autotest:在资源工作区,选中MENUàIDR_MAINFRAMEà点中空的菜单条à属性à令ID=ID_AUTOTEST,标题=Autotest。
  在ClassWizard中,对应Class name=CNetestView,Object IDs=ID_AUTOTEST,Message =COMMAND,点击Add FunctionàOnAutotest àEdit Code,增加相应代码如下:
void CNtestView::OnAutotest() { SetTimer(1, 30000,NULL); //each 30s interupt 1 time. Tc=20; CWnd* pParent=GetParent(); CMenu * pMenu=pParent->GetMenu(); pMenu->EnableMenuItem(ID_AUTOPING,MF_BYCOMMAND| MF_DISABLED | MF_GRAYED); pMenu->EnableMenuItem(ID_STOPAUTO,MF_ENABLED); AfxGetMainWnd()->SendMessage (WM_TIMER,0, 0L); }
  其中SetTimer()将定时器设为每30秒中断一次。由Tc计算中断次数。余下几句条语句令Autotest菜单变灰,以免多次重入。最后一条语句使得鼠标点击Autotest菜单后,即转到OnTimer()函数开始自动测试。

  (3)增加定时测试代码。在ClassWizard中,对应Class name=CNetestView的Message, 选中WM_TIMERàAdd FunctionàEdit Code,在OnTimer() 函数中增加如下代码:
void CNetestView::OnTimer(UINT nIDEvent) { if(Tc++<20) return; KillTimer(1); Tc=0; BOOL bOK=TRUE; InvalidateRect(NULL); for(int ipT=0;ipT { if(Autotest(lpHost[ipT].nodeIP,3)==FALSE) { CString strerr; strerr.Format("err%d.wav",ipT+1); sndPlaySound(strerr, SND_LOOP |SND_ASYNC ); HDC hdc= CreateDC("DISPLAY",0,0,0); SelectObject(hdc,lpHost[ipT].hrgn); InvertRgn(hdc,lpHost[ipT].hrgn); DeleteDC(hdc); bOK=FALSE; } else if(bOK) sndPlaySound("Bird0.wav", SND_ASYNC); } SetTimer(1, 30000,NULL); CFormView::OnTimer(nIDEvent); }
0
相关文章