こんにちは、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???);
オフセットを設定する方法を見つける必要があります。私が知っている唯一の方法は、ペイロードの長さを取得してから、パケットの長さ - ペイロードの長さ = my 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から正しい 10 進数8に正しくデコードする方法は? また、IPv6 パケット全体のサイズを取得してオフセットを計算するにはどうすればよいでしょうか? IPv6 が IPv4 のように IHL を持たないのはなぜですか? これは、IPv6 に関する作業を非常に複雑にしていると思います。