资源描述:
《MFC实现的ping功能》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、方法:如何解决用MFC实现的ping功能中把目标主机不可到达的当成ping通的问题转载请注明来源:http://www.cnblogs.com/xuesongshu/ 网上查到的资料能实现ping功能,但是都有一个问题,它只检测是否存在错误,而不检测ICMP数据包是哪个机器回复的,这样造成一种错误的情况:当PC与路由器连通时,如果路由器回复该主机不可达,那么程序一样回应PING通了。目前网络上搜索不到相关正确的资料,我把我的方法分享给网友们。运行截图:本段程序代码是我做的一个软件的其中的一个功能
2、。该方法是一个线程的主体。1234567891UINT DoPingHost(LPVOID lParam){ WSADATAwdPing; SOCKETskPing; DWORD dwIpDest; LARGE_INTEGERliBegin,liEnd,liClockFrequency; double dSpan=0; struct sockaddr_indestAddr,fromAddr; int nTimeOut=3000,nPingCount=4,n
3、Bread=0,nFromLen=sizeof(fromAddr),nPingPort=0,nPingFailCount=0,nSliderPos=0;01112131415161718192021222324252627282930313 char*cIcmpData=new char[10]; char cLoalName[100],cRecvBuffer[100]; IcmpHeader*icmpData=(IcmpHeader*)cIcmpData; CLanCop
4、yDlg*cd=(CLanCopyDlg*)lParam; CStringszMsg,szTmp; BOOL bCanBrowse=FALSE; ::QueryPerformanceFrequency(&liClockFrequency); memset(cIcmpData,0,sizeof(IcmpHeader)); cd->GetDlgItem(IDC_BUTTON_MACHINE)->EnableWindow(FALSE); cd->GetDlgItem(
5、IDC_BUTTON_MACHINE)->SetWindowText("请稍等"); if (::WSAStartup(MAKEWORD(2,1),&wdPing)) { ::MessageBox(cd->m_hWnd,TEXT("网络初化异常,Socket创建失败!"),"异常",MB_OK
6、MB_ICONERROR); return 0; } skPing=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP); s
7、etsockopt(skPing,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTimeOut,sizeof(nTimeOut)); ((CIPAddressCtrl*)(cd->GetDlgItem(IDC_IPADDRESS_DEST)))->GetAddress(dwIpDest); dwIpDest=MAKEIPADDRESS(FOURTH_IPADDRESS(dwIpDest),THIRD_IPADDRESS(dwIpDest),SECOND_IPADDRE
8、SS(dwIpDest),FIRST_IPADDRESS(dwIpDest)); destAddr.sin_addr.S_un.S_addr=dwIpDest; destAddr.sin_family=AF_INET; srand(time(NULL)); nPingPort=rand()%1024+1024; destAddr.sin_port=nPingPort; icmpData->i_type=8; icmpData->i_code=0; i
9、cmpData->i_id=(u_short)::GetCurrentProcessId(); icmpData->i_seq=0; gethostname(cLoalName,100); nSliderPos=0; cd->m_sliderCopyFile.SetPos(nSliderPos); for (int i=0;i