IcmpSendEcho失败但“ping”成功

问题描述 投票:1回答:2

我一直在寻找使用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,同样的设备也失败了。

c++ c windows winapi
2个回答
0
投票

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


0
投票

我一直有类似的问题,但我认为这个问题是由于icmp请求在你收到回复之前超时。

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

通常我的输出日志表明第一次ping尝试失败,错误为11010.第二次尝试总是成功。所以我猜第一次ping给了机器一个戳并唤醒它,但我想念延迟的回复。第二次ping成功。

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

© www.soinside.com 2019 - 2024. All rights reserved.