2

こんにちは、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 に関する作業を非常に複雑にしていると思います。

4

1 に答える 1

2

これは問題かもしれませんが、消化するのは少し難しかったです。

どうやら、recvfrom() を使用すると、IPv6 ヘッダーが自動的に切り取られます。

見積もり

発信パケットには、(宛先アドレスに基づいて) 先頭に IPv6 ヘッダーが自動的に追加されます。 ソケットの着信パケットは、IPv6 ヘッダーとすべての拡張ヘッダーが削除された状態で受信されます。

ipv6 マニュアルページ

したがって、基本的にバッファはデータから始まり、オフセットしているバイトにはランダムな上位層データが含まれています。

于 2012-11-06T12:13:50.217 に答える