我一直在寻找使用IcmpSendEcho
,并发现它将无法ping某些设备(例如我的BT家庭Hub 4)GetLastError
报告11010.虽然对于其他设备,它工作正常在同一个系统上执行)。相比之下,所有这些设备上的ping.exe
都成功了,但我不知道Ping
的实现方式有何不同。到目前为止,我尝试过的所有情况都是IPv4,我直接提供的(所以没有DNS等)。IcmpSendEcho失败,但“ping”成功
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页面上发布的示例非常相似。您是否尝试过运行网络捕获工具以查看数据包是否真的离开主机? – 2014-10-20 21:33:59
11010是'IP_REQ_TIMED_OUT'。 – 2014-10-20 22:30:47
是的,ping.exe始终小于2ms到我的本地局域网路由器......我会尝试在Wireshark中比较它们。 – 2014-10-21 08:13:00