代码之家  ›  专栏  ›  技术社区  ›  bortzmeyer

使用resolv的名称解析器。h与IPv6

  •  3
  • bortzmeyer  · 技术社区  · 15 年前

    我编写或修改执行名称解析并需要 良好的过程控制。所以我不使用 getaddrinfo() ,我去 深入研究和利用 res_query() / res_send() /等等 resolv.h ,记录在案 在解析器(3)中。

    虽然没有文档记录,但设置所用解析器的常用方法是 使现代化 _res.nsaddr_list .但此数组在resolv中定义。h、 商店 struct sockaddr_in ,即仅IPv4地址。(IPv6地址) 是 struct sockaddr_in6 ,家庭独立系统将使用 struct sockaddr .)

    我正在寻找一种方法(最好是便携的,至少在 各种各样的(Unix)告诉 _res 我还需要IPv6地址。

    显然,很久以前,在FreeBSD中有一个 _res_ext 用这个 但是我在最近的FreeBSD7中再也找不到了( grep _res_ext /usr/include/resolv.h 什么也找不到)。你仍然可以找到 code which uses it (你自己试试 with Google Codesearch ).

    多亏了阿尔尼塔克,我注意到现在很明显 _res._ext 而不是 .res_ext .我想知道这些事情是在哪里记录或公布的。。。我不知道如何携带 _决议(附件) 是我可以在Debian和FreeBSD上找到它。似乎很少有程序使用它。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Alnitak    15 年前

    Stphane-如果您的 resolv.h 不包括对的任何支持 sockaddr_in6 这表明在您的特定O/S上,解析程序本身不支持IPv6传输。

    我在这里检查了我的一些系统:

    • MacOS X 10.5.6-支持BIND 9库,该库具有 res_setservers() 功能哪个 可以 以IPv6地址为例,没有 _res._ext 扩大

    • CentOS 5.2-具有 _决议(附件) 扩展,尽管在的手册页中没有提到IPv6 resolv.conf 除了有一个设置告诉解析器在为其查找记录之前返回AAAA记录 gethostbyname() .

    编辑-还有 CVS repository 对于FreeBSD,建议使用FreeBSD 7.0(参见标签 FREEBSD_7_0_0_RELEASE )也支持 res_setservers() 从9号开始。

        2
  •  1
  •   albert albert    15 年前

    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
    

    我觉得很混乱,你可能需要自动确认。