PING_IP

来源:互联网 发布:淘宝怎么看五星好评 编辑:程序博客网 时间:2024/06/18 06:53
// Judge if net works through ICMP,// return true if okbool 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;    }}