#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)), чтобы получить имя домена по умолчанию, порядок поиска и адреса серверов имен.