我一直在考虑使用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
,但同样的设备也失败了。
答案 0 :(得分:0)
尝试使用管理员权限运行。
答案 1 :(得分:0)
我也遇到了类似的问题,但是我认为问题是由于icmp请求在收到回复之前超时。
我的代码很大程度上基于IcmpSendEcho的MSDN页面中的示例代码,只有我添加了一些有关失败的重试信息。我的代码在晚上运行,这时机器很可能已经进入睡眠或其他低功耗状态,这意味着它们需要几秒钟的时间才能唤醒并回复。
通常,我的输出记录为第一次ping尝试失败,错误11010。第二次尝试始终成功。因此,我猜测第一次ping会给机器戳一声并唤醒它,但我错过了延迟的回复。第二次ping成功。
因此,请尝试添加更长的超时时间或仅添加一些重试。