嗨,我坚持从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-&gt; ip6_ctlun.ip6_un1.ip6_un1_plen 是一些奇怪的数字。
从上面的代码我接收:
Payload length: 25332
Payload length ntohs: 62562
将ICMP6_ECHO_REQUEST发送至ipv6.google.com
后但如果我查看wireshark,Payload长度为8个字节。如何正确解码 uint16_t 中的有效负载编号以更正十进制数 8 ?如何获得IPv6数据包的整体大小来计算偏移?为什么IPv6没有IHL作为IPv4?这让IPv6的工作变得非常复杂。
答案 0 :(得分:2)
虽然这对我来说有点难以理解,但这可能是个问题。
显然,当使用recvfrom()时,IPv6标头会自动裁剪掉。
<强>引用强>
传出数据包会自动为其添加IPv6标头 (基于目的地地址)。 套接字上的传入数据包是 收到IPv6标头并删除了任何扩展标头。
所以基本上你的缓冲区从数据开始,你偏移的字节包含一些随机的高层数据。