从IPv6数据包获取ICMPV6标头



嗨,我坚持从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?我认为这使工作变得非常复杂。

这可能是问题,尽管我很难消化。

似乎在使用recvFrom()时自动裁剪IPv6标头。

QUOTE

发出的数据包自动将ipv6标头备份给他们(基于目标地址)。插座上的传入数据包带有IPv6标头和任何扩展标头接收。

ipv6人页

因此,基本上您的缓冲区从数据开始,而您要抵消的字节包含一些随机的高层数据。

最新更新