【问题标题】:Using the name resolver of resolv.h with IPv6在 IPv6 中使用 resolv.h 的名称解析器
【发布时间】:2023-03-17 22:38:01
【问题描述】:

我编写或修改执行名称解析并需要 良好的过程控制。所以我不使用getaddrinfo(),我去 更深入并在resolv.h 中使用res_query() / res_send() / 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 上找到它。似乎很少有程序使用它。

【问题讨论】:

    标签: c dns ipv6


    【解决方案1】:

    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,除了有一个设置告诉解析器在查找 @ 的 A 记录之前返回 AAAA 记录987654328@.

    编辑 - 另外,FreeBSD 的 CVS repository 表明 FreeBSD 7.0(请参阅标签 FREEBSD_7_0_0_RELEASE)也支持来自 Bind 9 的 res_setservers()

    【讨论】:

    • 但未记录 :-( susanna:~ % uname -r 7.0-RELEASE susanna:~ % man res_setservers res_setservers 没有手动输入
    • 我在 Linux/glibc 机器上找不到res_setservers。我认为 IPv6 分辨率没有标准 :-(
    • 奇怪 - 它在 resolv.h 文件中 :(。该符号确实存在于 Mac OS X 中,尽管它实际上是 res_9_setservers 并且 #define 可以访问普通版本。
    【解决方案2】:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 2011-03-29
      • 2011-02-27
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多