4

32 ビット整数を使用して IPv4 アドレスを格納する場合、整数のバイト順を考慮する必要があります。

ただ、128ビット整数型はほとんどのプラットフォームに組み込まれていないため、IPv6アドレスはバイト配列に格納する必要があるため、バイトオーダーは問題ではなくなったと思います。

私は正しいですか?または、IPv6 に対応する関数 htonlXXX はありますか?

4

5 に答える 5

11

IPv6 では、ipv6 アドレスのネットワーク バイト オーダーが必要です。hton と ntoh はすべて、アドレスをコードに格納する方法からパケットに格納する必要がある方法 (およびその逆) に変換することです。したがって、問題はコードにどのように格納するかになります。

また、コード内の IPv6 アドレスの定義により、バイト配列だけでなく、より多くの方法でアドレス指定できるようになります。

struct in6_addr
{
    union 
    {
        __u8 u6_addr8[16];
        __u16 u6_addr16[8];
        __u32 u6_addr32[4];
    } in6_u;
#define s6_addr in6_u.u6_addr8
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
};

ユーザーにとって、IPv6 アドレスは 8 つの 16 ビット値として表されます。コードに 8 つの 16 ビット値として格納されたアドレスがある場合、u6_addr16[] 配列を使用してパケットに配置するときに各 16 ビット値で htons を使用し、各 16 ビット値を取得するときに ntohs を使用する必要があります。 -u6_addr16[] のビット値。

次のリンクが役に立ちます。

http://msdn.microsoft.com/en-us/library/ee175867.aspx

http://en.wikipedia.org/wiki/IPv6_address (特に右上の図)

于 2013-01-13T12:19:00.863 に答える
4

ネットワーク バイト オーダーは、2 つの状況で役立ちました。まず、あなたが述べたように、アドレスで使用できます。次に、送信するデータのバイト順を考慮する必要があります。コメントで、TCP は単なるバイト ストリームであると言っているのは正しいですが、多くのプロトコルでは、数値のバイト順がネットワーク順になっています。

于 2013-01-13T09:06:35.920 に答える
4

ただ、128ビット整数型はほとんどのプラットフォームに組み込まれていないため、IPv6アドレスはバイト配列に格納する必要があるため、バイトオーダーは問題ではなくなったと思います。

それは従いません。バイト配列を構築するときは、データを 0123456789ABCDEF または FEDCBA976543210 の順序でパックするかどうかを検討する必要があります。正しいバイト順序が依然として必要です。単純に、ntohl()やなどの関数htonl()は 128 ビット アドレスの生成には適用できません。

たとえば、 inet_ntop()を使用して「プレゼンテーション」形式からバイナリ アドレスを生成する場合、どちらのアドレス タイプについてもバイト順を自分で考慮する必要はありません。バイト順は依然として重要ですが、API が処理してくれます。

于 2013-01-13T10:17:01.663 に答える
2

IPv4 アドレスとポート番号を処理するときにバイト オーダーに細心の注意を払う必要がある具体的な理由は、構造体sockaddr_inin_addrデータ メンバーが より大きい整数型charであり、その内容がネットワーク バイト オーダーである必要があるためです。

IPv4 でも、そのアドレス部分のバイト順について心配することを避けることができます。文字列から直接入力するには、inet_atonまたはinet_ptonを使用します。in_addr後者の関数は IPv6 アドレスも処理します ( を埋めますin6_addr)。

IPv6 を使用する場合でも、ポート番号が必要です。また、1 バイトより大きい単位でhtonsアクセスすることを選択した場合は、ホスト/ネットワークの変換が必要になります。in6_addr

あなたが言うように、プラットフォームに 128 ビット タイプがない場合は、単一の 32 ビット チャンクとしてin6_addrアクセスする方法で単一の 128 ビット チャンクとしてアクセスすることはできませんin_addr。しかし、128 ビット タイプのネットワーク インターフェイス/実装が 128 ビット ビューを公開することを決定した場合は、マッチングntohXhtonX機能も提供されることを願っています。

于 2013-01-13T13:19:27.013 に答える
1
struct in6_addr{
  uint8_t s6_addr[16];//128bit ipv6 address
};

この構造体を通して、あなたが正しいと思うこと。

于 2013-01-13T08:54:27.760 に答える