3

名前解決を実行し、プロセスを適切に制御する必要があるプログラムを作成または変更します。したがって、私は を使用しませんgetaddrinfo()。さらに深く掘り下げて、res_query()/ res_send()/ などを使用resolv.hします。

文書化されていませんが、使用されるリゾルバーを設定する一般的な方法は update_res.nsaddr_listです。しかし、resolv.h で定義されているこの配列に struct sockaddr_inは、IPv4 アドレスのみが格納されます。(IPv6 アドレスはstruct sockaddr_in6であり、ファミリに依存しないシステムは を使用しますstruct sockaddr。)

_resIPv6アドレスも必要であることを伝える方法(少なくともさまざまなUnixの中で移植可能であることが望ましい)を探しています。

どうやら、ずっと前に、_res_extこの機能を備えた FreeBSD がありましたが、最近の FreeBSD 7 ではもう見つかりません (grep _res_ext /usr/include/resolv.h何も見つかりません)。それを使用するコードを見つけることができます ( Google Codesearch で試してみてください)。

Alnitak のおかげで、明らかに今_res._extではなく.res_ext. この種のことはどこで文書化または発表されているのだろうか...移植性がどれほどかはわかりません_res._ext。Debian と FreeBSD で見つけることができます。それを使用するプログラムはほとんどないようです。

4

2 に答える 2

2

Stéphane -resolv.hサポートが含まれていない場合はsockaddr_in6、特定の O/S でリゾルバー自体が IPv6 トランスポートをサポートしていないことを示唆しています。

ここで私のシステムのいくつかをチェックしました:

  • MacOS X 10.5.6 - BIND 9 ライブラリをサポートします。このライブラリには、IPv6 アドレスを取得できるres_setservers()機能があり、拡張子はありません。_res._ext

  • CentOS 5.2 -拡張機能がありますが、A レコードを探す前に AAAA レコードを返すようにリゾルバーに指示する設定があること_res._extを除いて、man ページに IPv6 についての言及はありません。resolv.confgethostbyname()

編集 - また、FreeBSD のCVS リポジトリは、FreeBSD 7.0 (タグを参照FREEBSD_7_0_0_RELEASE) もres_setservers()Bind 9 からサポートすることを示唆しています。

于 2008-12-23T14:32:04.910 に答える
1

glibc:

res_setservers: no
__res_state._u._ext.nsaddrs
__res_state._u._ext.nsmap

次に従って、後者を MAXNS+1 に設定します。

http://sourceware.org/ml/libc-hacker/2002-05/msg00035.html

BSD libc:

res_setservers: yes
__res_state._u._ext.__res_state_ext

私には面倒に思えますし、おそらく autoconf が必要になるでしょう。

于 2009-09-28T22:10:43.520 に答える