2008-09-24 64 views
6

如果我們的服務器(運行在設備上)在獲得DHCP租約之前啓動,那麼它永遠不能使用主機名進行連接。使用glibc,爲什麼I/DHCP更改DNS服務器後,我的gethostbyname失敗?

如果發生這種情況,它可以通過IP地址找到主機,但不能通過DNS找到主機。

我最初認爲Curl DNS緩存在捲曲連接失敗時出現故障。但我用CURLOPT_DNS_CACHE_TIMEOUT來防止緩存地址捲曲,但連接仍然失敗。

+0

我可以通過詢問是否有其他解決方案來疏通這個古老的問題嗎?麻煩的是,`res_init()`比``libcurl`` API便攜性低得多。在一些支持Curl的平臺上它不存在;在許多其他情況下,它不是線程安全的。 – NickJH 2017-11-09 11:06:23

回答

9

事實證明,glibc gethostbyname_r將不會自動重新加載它的配置,如果該配置更改。你必須手動調用res_init。請參閱下面的bug report

注意:gethostbyname_r的手冊頁或rer_init都沒有提到此限制。

我的解決方案非常具體。它適用於我們長期運行的服務器,但它不是我理想的解決方案。

我有一個函數,它檢查/etc/resolv.conf中最後一個已知的mtime(0代表DNE)的mtime。如果兩個mtime 不同,那麼我調用res_init。該功能在程序啓動時調用,然後定期重新加載配置。


glibc的bug report

libc中的高速緩存的resolv.conf永遠

...

這就是res_init()是,調用它。

相關問題