【问题标题】:IcmpSendEcho fails but "ping" succeedsIcmpSendEcho 失败但“ping”成功
【发布时间】:2014-10-20 20:55:54
【问题描述】:

我一直在研究使用 IcmpSendEcho,发现它无法 ping 某些设备(例如我的 BT Home Hub 4),GetLastError 报告 11010。而对于其他设备它工作正常(在相同的系统)。相比之下,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,但同样的设备也失败了。

【问题讨论】:

  • 您的代码看起来与函数的 MSDN 页面上发布的示例非常相似。您是否尝试过运行网络捕获工具来查看数据包是否真的离开了主机?
  • 11010 是IP_REQ_TIMED_OUT。
  • 是的,ping.exe 到我的本地局域网路由器的时间始终小于 2 毫秒...我将尝试在 Wireshark 中比较它们。

标签: c++ c windows winapi


【解决方案1】:

尝试以管理员权限运行。

【讨论】:

    【解决方案2】:

    我也遇到过类似的问题,但我认为问题是由于 icmp 请求在您得到回复之前超时造成的。

    我的代码主要基于 MSDN 页面中IcmpSendEcho 的示例代码,只是我添加了多次失败重试。我的代码在晚上运行,此时机器可能已经进入睡眠状态或其他低功耗状态,这意味着它们需要几秒钟才能唤醒和回复。

    通常我的输出日志表明第一次 ping 尝试失败并出现错误 11010。第二次尝试总是成功。所以我猜第一个 ping 会戳一下机器并将其唤醒,但我错过了延迟的回复。第二次 ping 成功。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多