2014-10-20 315 views
1

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

+0

您的代码看起来与函数的MSDN页面上发布的示例非常相似。您是否尝试过运行网络捕获工具以查看数据包是否真的离开主机? – 2014-10-20 21:33:59

+0

11010是'IP_REQ_TIMED_OUT'。 – 2014-10-20 22:30:47

+0

是的,ping.exe始终小于2ms到我的本地局域网路由器......我会尝试在Wireshark中比较它们。 – 2014-10-21 08:13:00

回答

0

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

+0

这不提供问题的答案。一旦你有足够的[声誉](https://stackoverflow.com/help/whats-reputation),你将可以[对任何帖子发表评论](https://stackoverflow.com/help/privileges/comment);相反,[提供不需要提问者澄清的答案](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- I-DO-代替)。 - [来自评论](/ review/low-quality-posts/17003454) – wasthishelpful 2017-08-11 10:19:49