使用glibc,为什么我的gethostbyname在I/DHCP更改DNS服务器后失败?

使用glibc,为什么我的gethostbyname在I/DHCP更改DNS服务器后失败?,dns,glibc,dhcp,Dns,Glibc,Dhcp,如果我们的服务器(在设备上运行)在获得DHCP租约之前启动,那么它永远无法使用主机名进行连接 如果发生这种情况,它可以通过IP地址而不是DNS找到主机 我最初认为Curl DNS缓存出现故障,因为Curl连接失败。但我使用了CURLOPT\u DNS\u CACHE\u TIMEOUT来防止curl缓存地址,但连接仍然失败。结果表明,如果配置发生更改,glibc gethostbyname\r不会自动重新加载其配置。您必须手动调用res_init。见下文 注意:gethostbyname\u r

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

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


我最初认为Curl DNS缓存出现故障,因为Curl连接失败。但我使用了CURLOPT\u DNS\u CACHE\u TIMEOUT来防止curl缓存地址,但连接仍然失败。

结果表明,如果配置发生更改,glibc gethostbyname\r不会自动重新加载其配置。您必须手动调用res_init。见下文

注意:gethostbyname\u r和rer\u init的手册页都没有提到这个限制

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

我有一个函数,用于检查/etc/resolv.conf的mtime与最后一个已知的mtime(0表示DNE)。如果两个mtime 不同的是,我称之为res_init。此函数在程序启动时调用,然后定期调用以选择性地重新加载配置


glibc

libc永远缓存resolv.conf

这就是res_init()的作用,调用它


我可以通过询问是否有其他解决方案来挖掘这个古老的问题吗?问题在于
res_init()
的可移植性远不如
libcurl
API。在一些支持旋度的平台上,它并不存在;在其他许多情况下,它不是线程安全的。早在2017年末,这个问题最终在glibc 2.26中得到了解决。它在7.5版中被纳入RHE和CentOS中:该问题最终在2017年末的glibc 2.26中得到解决。它在7.5版中被合并到RHE和CentOS中:sourceware.org/bugzilla/show_bug.cgi?id=984