IcmpSendEcho失败但是" ping"成功

时间:2014-10-20 20:55:54

标签: c++ c windows winapi

我一直在考虑使用IcmpSendEcho,并发现在GetLastError报告11010时无法ping某些设备(例如我的BT Home Hub 4)。而对于其他设备,它可以正常工作(在同一系统上执行时)。相比之下,ping.exe在所有这些设备上都取得了成功,但我不知道Ping的实现有何不同。到目前为止我尝试过的所有案例都是IPv4,我直接提供(所以没有DNS等)。

    hIcmpFile = IcmpCreateFile();
    ipAddress = inet_addr(ipAddressStr);
    ...hIcmpFile is reused
    static const WORD sendSize = 32;
    static const DWORD replySize = sizeof(ICMP_ECHO_REPLY) + sendSize;
    char sendData[sendSize] = { 0 };
    char replyBuffer[replySize];
    auto ret = IcmpSendEcho(hIcmpFile, ipAddress, sendData, sendSize, NULL, replyBuffer, replySize, 1000);
    if (ret == 0)
    {
        auto error = GetLastError();

我发现的唯一其他报告是what would cause ICMPsendEcho to fail when ping.exe succeeds。然而,这些答案似乎与我的问题不同。我尝试使用不同的有效负载大小,我尝试了IcmpSendEcho2,但同样的设备也失败了。

2 个答案:

答案 0 :(得分:0)

尝试使用管理员权限运行。

答案 1 :(得分:0)

我也遇到了类似的问题,但是我认为问题是由于icmp请求在收到回复之前超时。

我的代码很大程度上基于IcmpSendEcho的MSDN页面中的示例代码,只有我添加了一些有关失败的重试信息。我的代码在晚上运行,这时机器很可能已经进入睡眠或其他低功耗状态,这意味着它们需要几秒钟的时间才能唤醒并回复。

通常,我的输出记录为第一次ping尝试失败,错误11010。第二次尝试始终成功。因此,我猜测第一次ping会给机器戳一声并唤醒它,但我错过了延迟的回复。第二次ping成功。

因此,请尝试添加更长的超时时间或仅添加一些重试。