使用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。