32 ビット整数を使用して IPv4 アドレスを格納する場合、整数のバイト順を考慮する必要があります。
ただ、128ビット整数型はほとんどのプラットフォームに組み込まれていないため、IPv6アドレスはバイト配列に格納する必要があるため、バイトオーダーは問題ではなくなったと思います。
私は正しいですか?または、IPv6 に対応する関数 htonlXXX はありますか?
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[] のビット値。
次のリンクが役に立ちます。
ネットワーク バイト オーダーは、2 つの状況で役立ちました。まず、あなたが述べたように、アドレスで使用できます。次に、送信するデータのバイト順を考慮する必要があります。コメントで、TCP は単なるバイト ストリームであると言っているのは正しいですが、多くのプロトコルでは、数値のバイト順がネットワーク順になっています。
ただ、128ビット整数型はほとんどのプラットフォームに組み込まれていないため、IPv6アドレスはバイト配列に格納する必要があるため、バイトオーダーは問題ではなくなったと思います。
それは従いません。バイト配列を構築するときは、データを 0123456789ABCDEF または FEDCBA976543210 の順序でパックするかどうかを検討する必要があります。正しいバイト順序が依然として必要です。単純に、ntohl()
やなどの関数htonl()
は 128 ビット アドレスの生成には適用できません。
たとえば、 inet_ntop()を使用して「プレゼンテーション」形式からバイナリ アドレスを生成する場合、どちらのアドレス タイプについてもバイト順を自分で考慮する必要はありません。バイト順は依然として重要ですが、API が処理してくれます。
IPv4 アドレスとポート番号を処理するときにバイト オーダーに細心の注意を払う必要がある具体的な理由は、構造体sockaddr_in
とin_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 ビット ビューを公開することを決定した場合は、マッチングntohX
とhtonX
機能も提供されることを願っています。
struct in6_addr{
uint8_t s6_addr[16];//128bit ipv6 address
};
この構造体を通して、あなたが正しいと思うこと。