2

使用 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 上,数据以 IP 标头开始,紧跟在 ICMPv6 标头和有效负载之后。

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

非常感激你的帮助!

4

1 回答 1

0

在 Winsock 上使用原始套接字不接收 IPv6 标头。正如这个 MSDN 页面所说

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

于 2014-05-17T21:56:40.077 回答