// 初始化WinSock nRet = 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] 下一页
|