【问题标题】:On Windows the ICMPv6 echo reply is missing the IP header在 Windows 上,ICMPv6 回显回复缺少 IP 标头
【发布时间】:2013-06-08 00:15:08
【问题描述】:

在使用 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 标头开始。

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

非常感谢您的帮助!

【问题讨论】:

    标签: windows boost-asio ipv6 ping icmp


    【解决方案1】:

    在 Winsock 上使用原始套接字无法接收 IPv6 标头。正如this MSDN page 所说

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      相关资源
      最近更新 更多