在使用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头数据?
非常感谢您的帮助!
答案 0 :(得分:0)
使用Winsock上的原始套接字不会收到IPv6标头。正如this MSDN page所说
对于IPv6(AF_INET6的地址族),应用程序接收 每个接收到的数据报中最后一个IPv6标头之后的所有内容 无论IPV6_HDRINCL套接字选项如何。该应用程序没有 使用原始套接字接收任何IPv6标头。