使用glibc,为什么在I / DHCP更改DNS服务器后我的gethostbyname失败?
时间:2020-03-06 14:38:35 来源:igfitidea点击:
如果我们的服务器(在设备上运行)在获取DHCP租约之前启动,则它永远无法使用主机名进行连接。
如果发生这种情况,它可以通过IP地址而不是DNS查找主机。
我最初以为Curl DNS缓存有问题,因为curl连接失败。但是我使用CURLOPT_DNS_CACHE_TIMEOUT来防止curl缓存地址,但是连接仍然失败。
解决方案
事实证明,如果glibc gethostbyname_r的配置发生更改,它不会自动重新加载其配置。我们必须手动调用res_init。请参阅下面的错误报告。
注意:gethostbyname_r的手册页和rer_init的手册页均未提及此限制。
我的解决方案非常具体。它适用于我们长期运行的服务器,但这不是我理想的解决方案。
我有一个功能,可以根据上次已知的mtime(对于DNE为0)检查/etc/resolv.conf的mtime。如果两个mtime
不同,然后我调用res_init。在程序启动时调用此函数,然后定期调用此函数以有选择地重新加载配置。
glibc错误报告
libc caches resolv.conf forever ... That's what res_init() is for, call it.