在Windows上,ICMPv6 echo回复缺少IP标头

时间:2013-06-12 00:49:50

标签: windows boost-asio ipv6 ping icmp

在使用ASIO-BOOST库接收ICMPv6回应回复时,我在Windows 7上遇到奇怪的问题。收到的数据缺少IP头,它只有ICMP头和有效负载。下面有一些更多细节:

//IPv4
replyBuffer.consume(replyBuffer.size());
mySocketIPv4->async_receive(replyBuffer.prepare(65575),..);
--packet received--
replyBuffer.commit(length);
std::istream istr(&replyBuffer);
icmp_header icmp_hdr;
ipv4_header ipv4_hdr
istr >> ipv4_hdr >> icmp_hdr;

注意:收到的数据也有IP标头

//IPv6
replyBuffer.consume(replyBuffer.size());
mySocketIPv6->async_receive(replyBuffer.prepare(65575),..);
--packet received--
replyBuffer.commit(length);
std::istream istr(&replyBuffer);
icmp_header icmp_hdr;
ipv6_header ipv6_hdr
//istr >> ipv6_hdr >> icmp_hdr; - works on Linux only
istr >> icmp_hdr;

注意:数据仅包含ICMPv6标头和有效负载。但是,在Linux上,数据以ICMPv6标头和有效负载后面的IP标头开始。

当我收到echo回复时,我需要从IP头获取TTL,源IP等信息。在这种情况下,如何访问IP头数据?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用Winsock上的原始套接字不会收到IPv6标头。正如this MSDN page所说

  

对于IPv6(AF_INET6的地址族),应用程序接收   每个接收到的数据报中最后一个IPv6标头之后的所有内容   无论IPV6_HDRINCL套接字选项如何。该应用程序没有   使用原始套接字接收任何IPv6标头。