// Judge if net works through ICMP, // return true if ok bool ping_ip(TCHAR* ip_addr) { int npIpSize = wcslen(ip_addr) + 1; TCHAR* pIp = new TCHAR[npIpSize]; if (NULL == pIp) { LOG_ERROR("Memory alloc failed."); return false; } memset(pIp, 0, npIpSize); wcscpy_s(pIp, npIpSize, ip_addr); // Firstly delete ":" if that exists TCHAR* pColon = wcsstr(pIp, L":"); if (NULL != pColon) { int nPos = pColon - pIp; pIp[nPos] = '\0'; } char sendBuf[] = "ICMP DATA"; unsigned long ipaddr = INADDR_NONE; char* pMultiByteIpAddr = FromWide(pIp); ipaddr = inet_addr(pMultiByteIpAddr); free(pMultiByteIpAddr); pMultiByteIpAddr = NULL; delete []pIp; pIp = NULL; HANDLE hIcmpFile = IcmpCreateFile(); if (INVALID_HANDLE_VALUE == hIcmpFile) { LOG_ERROR("Create ICMP file failed: %d", GetLastError()); return false; } int nReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(sendBuf); LPVOID pReplyBuffer = (void*)malloc(nReplySize); if (NULL == pReplyBuffer) { LOG_ERROR("Malloc failed."); return false; } DWORD dwRet = IcmpSendEcho(hIcmpFile, ipaddr, sendBuf, sizeof(sendBuf), NULL, pReplyBuffer, nReplySize, 1000); if (dwRet != 0) { PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)pReplyBuffer; if (IP_SUCCESS == pEchoReply->Status) { LOG_INFO("IP: %S is available.", ip_addr); free(pReplyBuffer); pReplyBuffer = NULL; return true; } else { LOG_INFO("IP: %S is NOT available", ip_addr); free(pReplyBuffer); pReplyBuffer = NULL; return false; } } else { LOG_INFO("IP: %S is NOT available", ip_addr); free(pReplyBuffer); pReplyBuffer = NULL; return false; } }