Используя glibc, почему мой gethostbyname перестает работать после того, как I / DHCP изменил DNS-сервер? - PullRequest
6 голосов
/ 24 сентября 2008

Если наш сервер (работающий на устройстве) запускается до получения аренды DHCP, он никогда не сможет подключиться с использованием имени хоста.

Если это произойдет, он может найти хосты по IP-адресу, но не по DNS.

Первоначально я думал, что DNS-кеш Curl был ошибочным, так как соединения curl потерпели неудачу. Но я использовал CURLOPT_DNS_CACHE_TIMEOUT, чтобы запретить кеширование адреса кэширования, но соединения все равно не удалось.

1 Ответ

11 голосов
/ 24 сентября 2008

Оказывается, что glibc gethostbyname_r не будет автоматически перезагружать свою конфигурацию, если эта конфигурация изменяется. Вы должны вручную вызвать res_init. См. отчет об ошибке ниже.

Примечание. Ни в справочной странице для gethostbyname_r, ни для rer_init не упоминается это ограничение.

Мое решение очень специфично. Это работает для нашего долго работающего сервера, но это не мое идеальное решение.

У меня есть функция, которая проверяет mtime файла /etc/resolv.conf с последним известным mtime (0 для DNE). Если два раза отличается тогда я называю res_init. Эта функция вызывается при запуске программы, а затем периодически для перезагрузки конфигурации.


Отчет об ошибке glibc

libc кеширует resolv.conf forever

...

Вот для чего нужна res_init (), назовите это.

...