3

我编写或修改执行名称解析并需要对过程进行良好控制的程序。所以我不使用getaddrinfo(),我更深入地使用res_query()/ res_send()/ etc in resolv.h,在resolver(3)中记录。

虽然没有记录,但设置使用的解析器的常用方法是更新_res.nsaddr_list. 但是这个在 resolv.h 中定义的数组 struct sockaddr_in只存储了 IPv4 地址。(IPv6 地址是struct sockaddr_in6,独立于家庭的系统将使用struct sockaddr。)

我正在寻找一种方法(最好是可移植的,至少在各种 Unix 中)来告诉_res我我也想要 IPv6 地址。

显然,很久以前,FreeBSD 中就有_res_ext这种能力,但我在最近的 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不包含对 then 的任何支持,sockaddr_in6则表明在您的特定 O/S 上,解析器本身不支持 IPv6 传输。

我在这里检查了我的一些系统:

  • MacOS X 10.5.6 - 支持 BIND 9 库,该库具有可以接受 IPv6 地址的res_setservers()功能,无需扩展。_res._ext

  • CentOS 5.2 - 有_res._ext扩展,虽然在手册页中没有提到 IPv6,resolv.conf除了有一个设置告诉解析器在查找 A 记录之前返回 AAAA 记录gethostbyname()

编辑 - 此外,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 回答