嗨,我一直坚持从 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 的工作变得非常复杂。