我编写或修改执行名称解析并需要
良好地控制过程。所以我不使用getaddrinfo()更深入并在res_query()中使用res_send() / 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什么也找不到)。你仍然可以找到
code which uses it(尝试with 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 repository建议FreeBSD 7.0(请参见标记FREEBSD_7_0_0_RELEASE)也支持Bind 9中的res_setservers()

    关于c - 在IPv6中使用resolv.h的名称解析器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/388930/

    10-12 20:43