システムプログラム(第6週): ライブラリ関数 getaddrinfo()


電子・情報工学系/システム情報工学研究科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()

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 という 行による。


Last updated: 2005/05/30 03:43:18
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>