проверка выполнена успешно, но gethostbyname() возвращает null

#c #linux #network-programming

#c #linux #сетевое программирование

Вопрос:

Я программирую для устройства под управлением ОС Linux.

Устройство ping успешно выполняет youtube.com команду. Однако в исходном коде, если я вызываю gethostbyname("youtube.com") , функция возвращает NULL .


ЖУРНАЛ ОБНОВЛЕНИЙ

Мой код выглядит следующим образом (это всего лишь короткий псевдокод для описания моей проблемы, а не полный код)

 void my_func()
{
    struct hostent     *hostEntry;
    
    hostEntry = gethostbyname("youtube.com");
    if (hostEntry) {
        // gethostbyname() resolve host name successfully, no need to care
    } else {
        printf("Fail to get host, herrno=%d, strErr=%sn", h_errno, hstrerror(h_errno));
    }
}
 

И вывод устройства при gethostbyname() возврате NULL равен

 Fail to get host, herrno=1, strErr=Unknown host
 

Это вывод устройства, когда я выхожу из программы и запускаю ping youtube.com

 $ ping youtube.com
PING youtube.com (64.233.189.91): 56 data bytes
64 bytes from 64.233.189.91: seq=0 ttl=55 time=57.824 ms
64 bytes from 64.233.189.91: seq=1 ttl=55 time=56.306 ms
64 bytes from 64.233.189.91: seq=2 ttl=55 time=56.790 ms
64 bytes from 64.233.189.91: seq=3 ttl=55 time=56.831 ms
64 bytes from 64.233.189.91: seq=4 ttl=55 time=56.417 ms
 

Что я должен проверить сейчас?

Комментарии:

1. @AnttiHaapala, я только что обновил свой вопрос

2. @xuanduc611 спасибо, комментарий удален, закрытое голосование отозвано и поддержано: D и вы запускаете ping на том же устройстве? Действительно ли проблема проявляется, если у вас просто есть int main(void) { my_func(); } #includes ?

3. — выполняемое устройство — my_func() это устройство, которое запускается ping . — «Действительно ли проблема проявляется …» => Я не уверен, src-код для этого устройства чрезвычайно огромен

4. Вы можете посмотреть, что ping использует для разрешения имен. Либо используйте большой молоток, например ltrace , или посмотрите на исходный код вашего ping. Если ваш ping из busybox, то ответом будет getaddrinfo

Ответ №1:

Я добавляю res_init() , чтобы решить эту проблему, и, к счастью, это работает.

 #include <resolv.h>

void my_func()
{
    struct hostent     *hostEntry;
    
    hostEntry = gethostbyname("youtube.com");
    if (hostEntry) {
        res_init();
        hostEntry = gethostbyname("youtube.com");
    }

    if (hostEntry) {
        // gethostbyname() resolve host name successfully, no need to care
    } else {
        printf("Fail to get host, herrno=%d, strErr=%sn", h_errno, hstrerror(h_errno));
    }
}
 

Это может быть причиной, по которой функция помогает

Функция res_init() считывает файлы конфигурации (см. resolv.conf(5)), чтобы получить имя домена по умолчанию, порядок поиска и адреса серверов имен.