使用resolv.h的名称解析器和IPv6
我编写或修改执行名称解析并需要对流程进行良好控制的程序。 所以我不使用getaddrinfo()
,我更深入地使用res_query()
/ res_send()
/ etc,记录在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上找到它。 似乎很少有程序使用它。
Stéphane – 如果您的resolv.h
不包含对sockaddr_in6
任何支持,则表明在您的特定O / S上,解析器本身不支持IPv6传输。
我在这里查看了一些系统:
-
MacOS X 10.5.6 – 支持BIND 9库,它具有
res_setservers()
函数,该函数可以使用IPv6地址,而不是_res._ext
扩展名。 -
CentOS 5.2 – 具有
_res._ext
扩展名,虽然在resolv.conf
的手册页中没有提到IPv6,除了在查找gethostbyname()
A记录之前有一个设置告诉解析器返回AAAA记录。
编辑 – 另外,FreeBSD的CVS存储库表明FreeBSD 7.0(参见标签FREEBSD_7_0_0_RELEASE
)也支持Bind 9的res_setservers()
。
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。