Я пишу приложение C, которое запускается как служба systemd при загрузке (дистрибутив : Arch Linux) и который должен подключаться к серверу. Поскольку приложение запускается при загрузке, в конечном итоге сетевое соединение еще не установлено. Это, естественно, приводит к отказу первой функции, для которой она требуется, в моем случае это getaddrinfo
.
Поэтому я подумал, что просто напишу цикл, который многократно вызывает getaddrinfo
до тех пор, пока он не завершится успешно, как только сеть будет готова. К сожалению, я обнаружил, что getaddrinfo
продолжает сбой с name or service not known
даже после того, как соединение было установлено.
Я могу пропинговать сервер по его имени хоста, но getaddrinfo
по-прежнему этого не делает. Если я останавливаю приложение и запускаю его снова, все работает нормально. Если сетевое соединение уже установлено до первого звонка, getaddrinfo
тоже работает нормально.
Судя по всему, если getaddrinfo
один раз не удалось, потому что сеть не была готова, то она будет давать сбой навсегда. Кажется, он не знает о существующей связи. При использовании устаревшего gethostbyname
поведение такое же.
В чем причина такого поведения? Есть ли способ заставить getaddrinfo
обновить внутренние переменные (если таковые существуют) или что-то подобное, что могло бы объяснить, почему функция все еще считает, что связи нет? Есть ли другая функция, которую я должен вызвать ранее, чтобы проверить, готова ли сеть?
Я хотел бы избежать задержки, которая ждет некоторое время, ожидая, что сеть будет подключена после этого. Я также предпочел бы проверять наличие соединения из своего приложения, а не сначала проверять его с помощью сценария bash, а затем запускать приложение.