我在Windows7上遇到奇怪的问题,当使用ASIO-BOOST库接收ICMPv6回应回复时。接收的数据缺少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上,数据以IP报头开始,紧跟在ICMPv6报头和有效负载之后。
当我收到回应回复时,我需要从IP头中获取一些信息,如TTL、源IP等。在这种情况下,如何访问IP头数据?
非常感谢您的帮助!
发布于 2014-05-18 05:56:40
在Winsock上不能使用原始套接字接收IPv6标头。正如this MSDN page所说
对于IPv6 (AF_INET6的地址族),应用程序接收每个接收到的数据报中最后一个IPv6报头之后的所有内容,而不考虑IPV6_HDRINCL套接字选项。应用程序不会使用原始套接字接收任何IPv6标头。
https://stackoverflow.com/questions/17056098
复制相似问题