Используя glibc, почему мой gethostbyname завершается с ошибкой после того, как I / DHCP изменил DNS-сервер?
Вопрос
Если наш сервер (работающий на устройстве) запускается до получения аренды 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(), вызовите ее.