现在的位置: 首页 > 综合 > 正文

PING_IP

2017年09月01日 ⁄ 综合 ⁄ 共 1333字 ⁄ 字号 评论关闭
// 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;
    }
}

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.