プログラムによるIPv6サポート
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/04/02 14:26 UTC 版)
「IPv6」の記事における「プログラムによるIPv6サポート」の解説
IPv6をアプリケーションで利用するためのプログラムは、IPv4でのプログラムと比べて大きな違いがあるものではない。 ネットワークを利用するプログラムではソケットを利用することが多く、通常のIPv4プログラミングでsocketを作成するときには s = socket(AF_INET, SOCK_STREAM, 0); のように、アドレスファミリ部をIPv4固定で指定することが多いが、一つのサイトがIPv4とIPv6の両プロトコルに対応している場合や、どちらに対応しているのか事前にはわからないことを考慮すると、DNSで一つの名前を検索した後、列挙された複数のプロトコルのアドレスに対して順番にconnectを試みる必要がある。 アドレスを検索する際は、IPv4のみを前提としているgethostbyname() や、socket同様にアドレスファミリ固定であるgethostbyname2() などではなく、getaddrinfo() を利用する。 以上をまとめると、典型的なソケットを作成するCのコードは以下のようになる。 struct addrinfo hints, *res, *res0;int error, s;memset(&hints, 0, sizeof(hints));hints.ai_family = PF_UNSPEC;hints.ai_socktype = SOCK_STREAM;/* TCPの場合 */if ((error = getaddrinfo("ホスト名", "サービス名", &hints, &res0)) != 0)return -1;s = -1;for (res = res0; res != NULL; res = res->ai_next) {if ((s = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1)continue;if (connect(s, res->ai_addr, res->ai_addrlen) == 0)break;close(s);s = -1;}freeaddrinfo(res0);if (s == -1) {/* Could not connect */} else {/* Success */} この手法はIPv6のみならず、別のIPプロトコルが登場した場合にも有効な手法で、プロトコル独立プログラミングなどと呼ばれる。 なお、ここで示した方法は、getaddrinfo() によって返されるアドレスファミリの順に接続を試みるので、AAAAレコードより先にAレコードを返すようなgetaddrinfo() では、IPv6による通信が行われない可能性もある。
※この「プログラムによるIPv6サポート」の解説は、「IPv6」の解説の一部です。
「プログラムによるIPv6サポート」を含む「IPv6」の記事については、「IPv6」の概要を参照ください。
- プログラムによるIPv6サポートのページへのリンク