6

如果我们的服务器(在设备上运行)在获得 DHCP 租约之前启动,那么它永远无法使用主机名进行连接。

如果发生这种情况,它可以通过 IP 地址而不是 DNS 找到主机。

我最初认为 Curl DNS 缓存有问题,因为 curl 连接失败。但是我使用 CURLOPT_DNS_CACHE_TIMEOUT 来防止 curl 缓存地址,但连接仍然失败。

4

1 回答 1

11

事实证明,glibc gethostbyname_r 不会在配置发生更改时自动重新加载它的配置。您必须手动调用 res_init。请参阅下面的错误报告

注意:gethostbyname_r 和 rer_init 的手册页都没有提到这个限制。

我的解决方案非常具体。它适用于我们长期运行的服务器,但它不是我理想的解决方案。

我有一个函数可以检查 /etc/resolv.conf 的 mtime 与最后一个已知的 mtime(DNE 为 0)。如果这两个 mtime 不同,那么我调用 res_init。这个函数在程序启动时被调用,然后周期性地重新加载配置。


glibc错误报告

libc 永远缓存 resolv.conf

...

这就是 res_init() 的用途,称之为。

于 2008-09-24T04:58:27.667 回答