我正在尝试仅使用该文件将主机名解析为 IP 地址/etc/hosts
。
也就是说,如果无法在本地解析名称,则解析必定失败(即不发送 DNS 请求)。解析名称的标准方法是使用getaddrinfo
,但这将回退到 DNS。
gethostent_r
似乎是一个很好的候选者,因为它从本地主机文件返回记录,但不幸的是,我没有得到 IPv6 记录,只有 IPv4。
如何仅根据本地 /etc/hosts 文件将名称解析为 IPv4 或 IPv6 地址?
我正在尝试仅使用该文件将主机名解析为 IP 地址/etc/hosts
。
也就是说,如果无法在本地解析名称,则解析必定失败(即不发送 DNS 请求)。解析名称的标准方法是使用getaddrinfo
,但这将回退到 DNS。
gethostent_r
似乎是一个很好的候选者,因为它从本地主机文件返回记录,但不幸的是,我没有得到 IPv6 记录,只有 IPv4。
如何仅根据本地 /etc/hosts 文件将名称解析为 IPv4 或 IPv6 地址?
我觉得这不对。它应该返回两种类型,假设它们实际上在 /etc/hosts 中 - 但它可能会将它们作为两个单独的条目返回,因为它逐行检查文件。
其他方法:
如果您正在使用 glibc,您可能能够调用– 该工具用来实现其选项
__nss_configure_lookup("hosts", "files")
的内部 glibc 函数(如)。getent
-s
{"getent", "-s", "hosts", arg}
对于 glibc 来说,一个稍微好一点的方法就是直接使用
dlopen()
相应的 libnss “后端”模块,该模块负责从 /etc/hosts 提供主机名查找;也就是说libnss_files.so.2
。glibc 和 libnss 模块之间的接口有点混乱(尤其是几个不同的“主机名”函数),但它很稳定。这两种方式都比编写自己的解析器更可取,虽然不是因为 CPU 使用率,而是因为您的自定义解析器很可能不完整,并且与 glibc 本身解析 /etc/hosts 的方式不匹配。确保使用同一名称的多个地址映射、同一地址的多个名称、同一名称的混合 IPv4 和 IPv6 映射等来测试您的解析器。否则用户/系统管理员可能会非常恼火。
系统实际上并没有“已经完成”它。在大多数 Linux 系统上,没有 /etc/hosts 的中央缓存;它由每个进程独立解析。(某些系统可能运行“nscd”通用名称查找缓存守护程序,但这并不常见。)因此,如果您执行 gethostbyname() 并让 libc 读取 /etc/hosts,这实际上与您自己解析它相同。