10

ネットワーク アプリケーションを開発し、ソケット API を使用しています。

sockaddr_in6構造体のsin6_addrバイトオーダーを設定したい。

16 ビットまたは 32 ビットの変数の場合は、簡単です: htons または htonl を使用する:

// IPv4
sockaddr_in addr;
addr.sin_port = htons(123);
addr.sin_addr.s_addr = htonl(123456);

しかし、128 ビット変数の場合、バイト オーダーをネットワーク バイト オーダーに設定する方法がわかりません。

// IPv6
sockaddr_in6 addr;
addr.sin6_port = htons(123);
addr.sin6_addr.s6_addr = ??? // 16 bytes with network byte order but how to set?

htons を 8 回 (2 * 8 = 16 バイト) 使用するか、htonl を 4 回 (4 * 4 = 16 バイト) 使用するという回答もありますが、どちらが正しいかはわかりません。

ありがとう。

4

2 に答える 2

16

s6_addrメンバーstruct in6_addrは次のように定義されます。

uint8_t s6_addr[16];

uint8_tこれは単一の128ビット整数型ではなくの配列であるため、エンディアンの問題は発生しません。ソースuint8_t [16]配列から宛先にコピーするだけです。たとえば、2001:888:0:2:0:0:0:2使用するアドレスをコピーするには、次のようにします。

static const uint8_t myaddr[16] = { 0x20, 0x01, 0x08, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };

memcpy(addr.sin6_addr.s6_addr, myaddr, sizeof myaddr);
于 2011-05-18T05:34:32.280 に答える
0

通常は、ホスト名ルックアップ ルーチンの 1 つを使用し、その結果を使用します。これは、既にネットワーク バイト オーダーになっています。ハードコーディングされた数値の IP アドレスをまったく扱っているのはなぜですか?

于 2011-05-17T09:53:30.637 に答える