|  // 初始化WinSocknRet = WSAStartup(0x0101, &wsaData );
 if (nRet)
 {
 ::MessageBox(NULL, "WSAStartup() error:", "Error:", MB_OK);
 WSACleanup();
 FreeLibrary((HMODULE)hndlIcmp);
 return;
 }
 
 // 检查WinSock的版本
 if (0x0101 != wsaData.wVersion)
 {
 ::MessageBox(NULL, "No WinSock version 1.1 support found", "Error:", MB_OK);
 WSACleanup();
 FreeLibrary((HMODULE)hndlIcmp);
 return;
 }
 bValid = TRUE;
 }
   CPing类的析构函数完成相反的动作: CPing::~CPing(){
 WSACleanup();
 FreeLibrary((HMODULE)hndlIcmp);
 }
   CPing类的Ping函数是最核心的函数,实现真正的ping操作: int CPing::Ping(char *strHost){
 struct in_addr iaDest; // Internet地址结构体
 LPHOSTENT pHost; // 主机入口结构体指针
 DWORD *dwAddress; // IP地址
 IPINFO ipInfo; // IP选项结构体
 ICMPECHO icmpEcho; // ICMP Echo回复buffer
 HANDLE hndlFile; // IcmpCreateFile函数打开的句柄
 
 if (!bValid)
 {
 return FALSE;
 }
  //使用inet_addr()以判定ping目标为地址还是名称iaDest.s_addr = inet_addr(strHost);
 if (iaDest.s_addr == INADDR_NONE)
 pHost = gethostbyname(strHost);
 else
 pHost = gethostbyaddr((const char*) &iaDest, sizeof(struct in_addr),AF_INET);
 if (pHost == NULL)
 {
 return FALSE;
 }
   // 拷贝IP地址dwAddress = (DWORD*)(*pHost->h_addr_list);
   // 获得ICMP Echo句柄hndlFile = pIcmpCreateFile();
   // 设置发送信息缺省值ipInfo.Ttl = 255;
 ipInfo.Tos = 0;
 ipInfo.IPFlags = 0;
 ipInfo.OptSize = 0;
 ipInfo.Options = NULL;
 icmpEcho.Status = 0;
 
		      
		      
		      
		      
		      
		      
                        共9页: 上一页 [1] 2 [3] [4] [5] [6] [7] [8] [9] 下一页 |