使用resolv.h的名称解析器和IPv6

时间:2008-12-23 14:07:41

标签: c dns ipv6

我编写或修改执行名称解析并需要a的程序 良好的控制过程。所以我不使用getaddrinfo(),我走了 更深入,并在res_query()中使用res_send() / resolv.h / etc,记录在案 在解析器(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一无所获)。你仍然可以找到 code which uses it(试一试with Google Codesearch)。

感谢Alnitak,我注意到它现在显然是_res._ext而不是.res_ext。我想知道这些事情在哪里被记录或公布......我不知道它是多么便携_res._ext。我可以在Debian和FreeBSD上找到它。似乎很少有程序使用它。

2 个答案:

答案 0 :(得分:2)

Stéphane - 如果您的resolv.h不包含对sockaddr_in6的任何支持,则表明您的特定操作系统上的解析器本身不支持IPv6传输。

我在这里查看了一些系统:

  • MacOS X 10.5.6 - 支持BIND 9库,该库具有res_setservers()功能,可以获取IPv6地址,但不会_res._ext扩展。

  • CentOS 5.2 - 具有_res._ext扩展名,但在resolv.conf的手册页中没有提及IPv6,只是有一个设置告诉解析程序在查找之前返回AAAA记录gethostbyname()

  • 的记录

编辑 - 同样,FreeBSD的CVS repository表明FreeBSD 7.0(参见标记FREEBSD_7_0_0_RELEASE)也支持来自Bind 9的res_setservers()

答案 1 :(得分: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。