2

嗨,我一直坚持从 IPv6 数据包获取 ICMPv6 标头。

        size = sizeof(sockaddr_in6);
        if ((lenght = recvfrom(socd, buffer, BUFSIZE, 0, (sockaddr *)&receiveSockAddr, &size)) < 0) {
          cerr << "recvfrom error" << endl;
        }

        ip = (ip6_hdr *) buffer;

        cout << "Payload length: " << ip->ip6_ctlun.ip6_un1.ip6_un1_plen << endl;
        cout << "Payload length ntohs: " << ntohs(ip->ip6_ctlun.ip6_un1.ip6_un1_plen) << endl;

        //icmpRec = (icmp6_hdr *) (buffer + ???offset???);

我需要找出如何设置偏移量。我知道的唯一方法是获取有效负载长度,然后是:数据包长度 - 有效负载长度 = 我的偏移量。但是在ip->ip6_ctlun.ip6_un1.ip6_un1_plen中有一些奇怪的数字。

从我收到的上面的代码中:

Payload length: 25332
Payload length ntohs: 62562 

将 ICMP6_ECHO_REQUEST 发送到 ipv6.google.com 后

但是如果我查看wireshark,有效负载长度是8个字节。如何正确解码uint16_t中的有效载荷编号以更正十进制数8?以及如何获取 IPv6 数据包的整个大小来计算偏移量?为什么 IPv6 没有 IHL 作为 IPv4?我认为这使 IPv6 的工作变得非常复杂。

4

1 回答 1

2

这可能是问题所在,尽管我有点难以消化。

显然,当使用 recvfrom() 时,IPv6 标头会自动裁剪掉。

引用

传出的数据包会自动附加一个 IPv6 标头(基于目标地址)。 接收到套接字上的传入数据包时,IPv6 标头和所有扩展标头都被删除。

ipv6 手册页

所以基本上你的缓冲区从数据开始,你偏移的字节包含一些随机的更高层数据。

于 2012-11-06T12:13:50.217 回答