IPv6 ソケット API プログラミングの基礎知識 (シリーズ第 1 回)

xllmnrd を製作する過程で習得した IPv6 ソケット API に関する知見を、少しずつ書いていこうという不定期連載企画です。反応が薄ければ うやむやにするかもしれませんが…。

さて記念すべき第 1 回ですが、まずは sockaddr_in6 構造体の紹介で始めたいと思います。IPv4 の sockaddr_in 構造体に対応するものですが、この構造体には以下のメンバーがあります (OS によっては他のメンバーがあることもありますが ここでは触れません):

sa_family_t sin6_family;
アドレスファミリーです。IPv6 では AF_INET6 を指定します。
in_port_t sin6_port;
ポート番号です。IPv4 と同様にネットワーク バイト オーダーで指定します。
uint32_t sin6_flowinfo;
これは IPv6 に特有のメンバーで、トラフィック クラスとフロー情報を指定します。とりあえず 0 としておきましょう。
struct in6_addr sin6_addr;
お待ちかね、IPv6 アドレスです。in6_addr 構造体については後述します。
uint32_t sin6_scope_id;
これも IPv6 に特有のメンバーで、スコープ ID を指定します。スコープを指定する必要がない場合は 0 としておきます。

IPv6 アドレスを指定する in6_addr 構造体には以下のメンバーがあります:

uint8_t s6_addr[16];
IPv6 アドレスをバイト列で指定します。IPv4 とは違ってバイト列なので、バイト オーダーは意識する必要がありません。

第 1 回はここまでにしておきます。次回はいつになるか分かりませんが、期待しないで待っていてください。