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

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

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

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

1 ответов


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

Примечание: ни man-страница для gethostbyname_r, ни для rer_init не упоминали об этом ограничении.

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

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


в glibc сообщить об ошибке

libc кэширует resolv.конф навсегда

...

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