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

StackOverflow https://stackoverflow.com/questions/125466

  •  02-07-2019
  •  | 
  •  

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

如果发生这种情况,它可以按IP地址查找主机,但不能通过DNS查找。

我最初认为Curl DNS缓存因卷曲连接失败而出错。但我使用CURLOPT_DNS_CACHE_TIMEOUT来防止curl缓存地址,但连接仍然失败。

有帮助吗?

解决方案

事实证明,如果配置发生变化,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()的用途,请调用它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top