我编写或修改执行名称解析并需要
良好地控制过程。所以我不使用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传输。
我在这里检查了一些系统:
res_setservers()
函数,可以接受IPv6地址,没有_res._ext
扩展名。 _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/