嗨,我坚持从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人页
因此,基本上您的缓冲区从数据开始,而您要抵消的字节包含一些随机的高层数据。