【问题标题】:Retrieve IPv4 and IPv6 nameservers programmatically以编程方式检索 IPv4 和 IPv6 名称服务器
【发布时间】:2018-09-09 18:24:21
【问题描述】:

我正在尝试使用 libresolv 读取我的 /etc/resolv.conf 文件中的 IPv4 和 IPv6 名称服务器:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.

nameserver 127.0.0.53
nameserver 2001:4860:4860:0:0:0:0:8888

这是我的 C 程序:

#include <resolv.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    res_state res = malloc(sizeof(struct __res_state));
    res_ninit(res);

    printf("IPv4 nscount:  %d\n", res->nscount);
    printf("IPv6 nscount6: %d\n", res->_u._ext.nscount6);

    return 0;
}

产生这个输出:

IPv4 nscount:  2
IPv6 nscount6: 0

这让我很惊讶。为什么将 IPv6 地址算作 IPv4 地址?

GDB 显示第二个地址被清零:

(gdb) display res.nsaddr_list[0]
5: res.nsaddr_list[0] = {sin_family = 2, sin_port = 13568, sin_addr = {s_addr = 889192575}, sin_zero = "\000\000\000\000\000\000\000"}
(gdb) display res.nsaddr_list[1]
6: res.nsaddr_list[1] = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}

谁能帮我理解这种行为?

【问题讨论】:

  • 警告:这些是出于兼容性目的而存在的古老 BSD 函数。对于您当前正在编写的任何内容,您确实应该使用 getaddrinfo() 及其朋友。
  • 如果您想要 /etc/resolv.conf 文件中的内容,打开它并阅读其内容不是更容易吗?

标签: linux gcc dns ipv6 libresolv


【解决方案1】:

您真的不应该访问解析器状态的_u._ext 部分,它们是内部实现细节。 nscount6 成员当前未使用且始终为零。必须保留它以避免由于结构偏移/大小更改而更改 ABI。

如果你需要域名服务器列表,你应该自己解析/etc/resolv.conf。请注意,最终 glibc 还将支持三个以上的名称服务器,并且这些额外的解析器不会反映在公共解析器状态中。

【讨论】:

  • 有没有替代 res_ninit( ) 的好方法。我目前正在解析 resolv.conf,但更愿意通过已发布的 API 连接到 resolv.conf。原因是我可以解析 resolv.conf 以获取手动 DNS 的 IP 地址。但是对于 DHCP DNS,我们确实需要一个公开的 API。因此,最好使用一个 API 来执行手动 DNS 和 DHCP DNS。
  • DHCP 客户端通常会以某种方式重写/etc/resolv.conf,所以如果你解析它,你应该很好。如果有本地缓存​​,它可能会给您127.0.0.1,但这很好,因为它是您应该使用的解析器。任何 API 都可能比直接解析 /etc/resolv.conf 更复杂。
  • 我测试过了。从 DHCP 服务器获取的 DNS 不会写入 resolv.conf。只有 res_ninit( ) 等 API 能够通过网络从 DHCP 服务器获取它。
  • 请发表一个不同的问题。这显然不是针对同一个操作系统的。
  • Linux 也一样。在 ubuntu 中运行 drautb 给出的相同程序并尝试更改 /etc/resolv.conf 的内容
猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 2017-12-10
  • 1970-01-01
  • 2012-02-02
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多