電子・情報工学系/システム情報工学研究科CS専攻 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2005/No6_files/getaddrinfo.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2005/
http://www.coins.tsukuba.ac.jp/~yas/
getaddrinfo(3) Linux Programmer's Manual getaddrinfo(3)
NAME
getaddrinfo - network address and service translation
int getaddrinfo(const char *node, const char *service,
const struct addrinfo *hints,
struct addrinfo **res);
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
size_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
};
ライブラリ関数 getaddrinfo() は、第一引数として、ホスト名、第2引数と
してポート番号に関連した(/etc/services に含まれている)、第3引数として、
調べたいアドレスの制約に関するヒントを与える。この例では、TCP/IP
(IPv4) なので、ai_family としてAF_INET, ai_socktype とし SOCK_STREAM
を指定している。(IPv4/IPv6 の両方に対応するには、AF_INET は指定しない
方がよい。)
ライブラリ関数 getaddrinfo() は、与えられた引数から、IP アドレス(やポー ト番号)を調べ、結果を構造体 struct addrinfo に格納して返す。その構造体 は、ヒープ(malloc() されたメモリ)に置かれている。関数 getaddrinfo() は、構造体へのポインタを第4引数で示された番地に保存する(第4引数は、 ポインタを保存するための番地)。
この構造体の中の ai_addr に目的の IP アドレスを組んだstruct sockaddr が含まれている。その構造体を、ai_addrlen バイト数分だけだけ addr 変数 にコピーしている。
1つのホストに複数の IP アドレスが割り当てられている場合もある。その場 合は、ai_next を手繰ればわかる。
ライブラリ関数 getaddrinfo() の内部的では、/etc/hosts というファイル や, NIS の hosts マップ, DNSの名前サーバなどが調べられる。どれがどの順 番で調べられるかは、システムに依存する。 /etc/nsswitch.conf があるシステムでは hosts: の行に書かれている。 /etc/host.conf というファイルがあるホストでは、そのファイルの order という 行による。