我一直在寻找使用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
,同样的设备也失败了。
尝试使用管理员权限运行。
我一直有类似的问题,但我认为这个问题是由于icmp请求在你收到回复之前超时。
我的代码主要基于IcmpSendEcho的MSDN页面中的示例代码,只是在失败时添加了一些重试。我的代码在晚上运行,当机器可能已经进入睡眠状态或其他一些低功率状态时,这意味着它们需要几秒钟才能唤醒并回复。
通常我的输出日志表明第一次ping尝试失败,错误为11010.第二次尝试总是成功。所以我猜第一次ping给了机器一个戳并唤醒它,但我想念延迟的回复。第二次ping成功。
因此,请尝试添加更长的超时或仅添加一些重试。