gpt4 book ai didi

c - 在 IPv6 中使用 resolv.h 的名称解析器

转载 作者:行者123 更新时间:2023-12-02 00:46:16 24 4
gpt4 key购买 nike

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

虽然没有记录,但设置解析器的常用方法是更新 _res.nsaddr_list。但是这个在 resolv.h 中定义的数组存储struct sockaddr_in,即仅 IPv4 地址。 (IPv6 地址是 struct sockaddr_in6,独立于系列的系统将使用 struct sockaddr。)

我正在寻找一种方法(最好是可移植的,至少在various 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 的任何支持,那么这表明在您的特定操作系统上,解析器本身不支持 IPv6 传输.

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

  • MacOS X 10.5.6 - 支持 BIND 9 库,它有一个 res_setservers() 函数,可以获取 IPv6 地址,没有 _res ._ext 扩展名。

  • CentOS 5.2 - 有 _res._ext 扩展名,尽管在 resolv.conf 的手册页中没有提到 IPv6,除了有一个设置告诉解析器在为 gethostbyname() 寻找 A 记录之前返回 AAAA 记录。

编辑 - 同样,CVS repository对于 FreeBSD,建议 FreeBSD 7.0(参见标签 FREEBSD_7_0_0_RELEASE)也支持来自 Bind 9 的 res_setservers()

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com