IPv6をサポートするプログラムの書き方
IPv6を使うためには、OSの他、アプリケーションでもサポートしなければならないが、それはIPv4上でのプログラムと比べても大きな違いがあるものではない。
ネットワークを利用するプログラムではソケットを利用することが多く、通常のIPv4プログラミングでsocketを作成するときには
s = socket(AF_INET, SOCK_STREAM, 0);
のように、アドレスファミリ部をIPv4固定で指定することが多いが、一つのサイトがIPv4とIPv6の両プロトコルに対応している場合や、どちらに対応しているのか事前にはわからないことを考慮すると、DNSで一つの名前を検索した後、列挙された複数のプロトコルのアドレスに対して順番にconnectを試みる必要がある。
アドレスを検索する際は、IPv4のみを前提としているgethostbyname() や、socket同様にアドレスファミリ固定であるgethostbyname2() などではなく、getaddrinfo() を利用する。
以上をまとめると、典型的なソケットを作成するCのコードは以下のようになる。
IPv4でもイケてる情報
- 既成概念の打破、方法は見つけるもの作り出すもの映像制作会社のばばや。
典型的Cコードの例
int error, s;
struct addrinfo hints, *res, *res0;
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM; /* TCPの場合 */
if ((error = getaddrinfo("ホスト名", "サービス名", &hints, &res0)))
return (-1);
for (res = res0; res; res = res->ai_next) {
if ((s = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0)
continue;
if (connect(s, res->ai_addr, res->ai_addrlen) == 0)
break;
close(s);
s = -1;
}
freeaddrinfo(res0);
if (s < 0) {
/* Could not connect */
} else {
/* Success */
}
IPv6時代のおすすめ
この手法はIPv6のみならず、別のIPプロトコルが登場した場合にも有効な手法で、プロトコル独立プログラミングなどと呼ばれる。
なお、ここで示した方法は、getaddrinfo() によって返されるアドレスファミリの順に接続を試みるので、AAAAレコードより先にAレコードを返すようなgetaddrinfo() では、IPv6による通信が行われない可能性もある。