ablog

不器用で落着きのない技術者のメモ

nsswitch.conf と ipnodes と getaddrinfo()

IPv4 アドレスと IPv6 アドレスでこれらの ipnodes データベースを生成してから、複数のネームサービスで ipnodes を探すように /etc/nsswitch.conf ファイルを変更してください。ホストアドレスの解決時に不要な遅延が発生してしまうからです (起動タイミングの遅れが発生することもあります)。

http://download.oracle.com/docs/cd/E19253-01/819-0380/ipv6-ref-69/index.html
  • ipnodes は、デフォルトでは files です。IPv4 から IPv6 への移行中には、すべてのネームサービスが、IPv6 アドレスを認識できるわけではないので、デフォルトの files を使用します。このデフォルトを使用しない場合には、アドレスの解決中に不必要な遅延が生じることがあります (ブート時の遅延など)。
  • アプリケーションは、IPv4 のアドレスを ipnodes データベースで検索してから、hosts データベースを検索します。ipnodes を指定する前に、IPv4 アドレスの両方のデータベースを検索する時間を考慮にいれる必要があります。
http://download.oracle.com/docs/cd/E19253-01/819-0382/a12swit-7/index.html

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

Man page of GETADDRINFO

IPでの名前解決を行なうためにgethostbynameを使うのが一般的でしたが、IPv6の登場とともに、名前解決にgetaddrinfo()を使わな?81?たものであるが、これらの関数と違い、 getaddrinfo() はリエントラントであり、 getaddrinfo() を使うことでプログラムは IPv4IPv6 の違いに関する依存関係をなくすことができる。

getaddrinfo:Geekなぺーじ