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

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

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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


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

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

...

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top