Ping 编程

/*
*函数介绍:CE下Ping方法
*入口参数:cIPAddr  : IP地址
*出口参数:pListBox : CListBox对象,用于显示Ping信息
*返回值:(无)
*/
void CdasfsadDlg::CEPing(CString cIPAddr,CListBox * pListBox)
{
    WSAData wsaData;
    //初始化Socket动态链接库
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        return ;
    }

    /*将IP地址转换成单字节*/
    char szDestIPAddr[255];
    ZeroMemory(szDestIPAddr,255);
    WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,cIPAddr.GetBuffer(cIPAddr.GetLength()),cIPAddr.GetLength() ,szDestIPAddr, cIPAddr.GetLength(),NULL,NULL);

    IPAddr ipAddr;
    //将目标字符串IP地址转换成IPAddr结构
    ipAddr = inet_addr(szDestIPAddr);     

    if (ipAddr == INADDR_NONE)
    {
        AfxMessageBox(_T("地址无效"));
        return ;
    }

    // 打开ping服务
    HANDLE hIP = IcmpCreateFile();
    if (hIP == INVALID_HANDLE_VALUE)
    {
        AfxMessageBox(_T("不能打开Ping服务"));
        return ;
    }

    // 构造ping数据包
    char acPingBuffer[64];
    memset(acPingBuffer, '*', sizeof(acPingBuffer));
    PICMP_ECHO_REPLY pIpe = (PICMP_ECHO_REPLY)GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, sizeof(ICMP_ECHO_REPLY) + sizeof(acPingBuffer));
    if (pIpe == 0)
    {
        AfxMessageBox(_T("分配ping包缓冲区失败"));
        return ;
    }

    CString m_recv;
    // 发送ping数据包
    m_recv = CString(L"ping ")+cIPAddr+CString(L" with 64 Bytes");
    pListBox->AddString(m_recv);
    for (int i=0;i<4;i++)
    {
        //发送ping服务包,等待接收时间为秒
        DWORD dwStatus = IcmpSendEcho(hIP,ipAddr, acPingBuffer, sizeof(acPingBuffer), NULL, pIpe, sizeof(ICMP_ECHO_REPLY) + sizeof(acPingBuffer), 1000);
        //当dwStatus不等于,代表接收到回应
        if (dwStatus != 0)
        {
            m_recv.Format(_T("Reply From %d.%d.%d.%d :bytes=%d time=%d TTL")
                ,int(LOBYTE(LOWORD(pIpe->Address)))
                ,int(HIBYTE(LOWORD(pIpe->Address)))
                ,int(LOBYTE(HIWORD(pIpe->Address)))
                ,int(HIBYTE(HIWORD(pIpe->Address)))
                ,int(pIpe->DataSize)
                ,int(pIpe->RoundTripTime)
                ,int(pIpe->Options.Ttl));
            pListBox->AddString(m_recv);
        }
        else
        {
            pListBox->AddString(_T("Error obtaining info from ping packet."));
        }
    }
    //释放已分配的内存
    GlobalFree(pIpe);
    //关闭Ping服务
    IcmpCloseHandle(hIP);
    //释放Socket资源
    WSACleanup();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值