APUE - 16.3 Addressing

本日はSection 16.3 Addressing。

getaddrinfo(3)

getaddrinfo() は、(インターネットのホストとサービスを識別する) node と service を渡すと、一つ以上の addrinfo 構造体を返す。それぞれの addrinfo 構造体には、 bind(2) や connect(2) を呼び出す際に指定できるインターネットアドレスが格納されている。 getaddrinfo() 関数は、 gethostbyname(3) と getservbyname(3) の機能をまとめて一つのインターフェースにしたものであるが、 これらの関数と違い、 getaddrinfo() はリエントラントであり、 getaddrinfo() を使うことでプログラムは IPv4IPv6 の違いに関する依存関係を なくすことができる。

使い方

IPv4IPv6の違いを吸収してくれ、かつ、リストで返してくれるので、得られたアドレスに片っ端からconnectして、接続できたsocketを使うというのが典型的らしい。

$ gcc -I include lib/error.c 16/address.c && ./a.out google.com http
type[stream]    host[google.com]        address[74.125.235.128] port[80]
type[stream]    host[google.com]        address[74.125.235.131] port[80]
type[datagram]  host[google.com]        address[74.125.235.133] port[80]
type[stream]    host[google.com]        address[74.125.235.133] port[80]
type[datagram]  host[google.com]        address[74.125.235.134] port[80]
type[stream]    host[google.com]        address[74.125.235.134] port[80]
type[datagram]  host[google.com]        address[74.125.235.135] port[80]
type[stream]    host[google.com]        address[74.125.235.135] port[80]
type[datagram]  host[google.com]        address[74.125.235.137] port[80]
type[stream]    host[google.com]        address[74.125.235.137] port[80]
type[datagram]  host[google.com]        address[74.125.235.128] port[80]
type[datagram]  host[google.com]        address[74.125.235.129] port[80]
type[stream]    host[google.com]        address[74.125.235.129] port[80]
type[datagram]  host[google.com]        address[74.125.235.131] port[80]
type[stream]    host[google.com]        address[74.125.235.136] port[80]
type[datagram]  host[google.com]        address[74.125.235.130] port[80]
type[stream]    host[google.com]        address[74.125.235.130] port[80]
type[datagram]  host[google.com]        address[74.125.235.136] port[80]
type[stream]    host[google.com]        address[74.125.235.132] port[80]
type[datagram]  host[google.com]        address[74.125.235.132] port[80]
type[datagram]  host[google.com]        address[74.125.235.142] port[80]
type[stream]    host[google.com]        address[74.125.235.142] port[80]
type[datagram]  host[google.com]
type[stream]    host[google.com]