#c #linux #sockets
Вопрос:
Я портирую свой код с Windows на Linux и застрял на проблеме: любой вызов gethostbyname() или getaddrinfo() блокируется навсегда.
struct hostent* hEnt;
hEnt = gethostbyname( "www.google.com" );
или
struct addrinfo hints;
struct addrinfo* ai;
int retVal;
memset( amp;hints, 0, sizeof( struct addrinfo ) );
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
hints.ai_protocol = 0;
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
retVal = getaddrinfo( "www.google.com", NULL, amp;hints, amp;ai );
пинг www.google.com работает просто отлично. Добавление www.google.com в /etc/hosts не очень помогает, так что это не сетевая проблема.
Я тестирую Debian 11 под управлением Hyper-V.
Любые предложения будут высоко оценены!
Комментарии:
1. На странице руководства написано: «Функции gethostbyname*(), gethostbyaddr*(), herror () и hstrerror() устарели. Приложения должны использовать getaddrinfo(3), getnameinfo(3) и gai_strerror(3) вместо этого».
2. Да, getaddrinfo () — это то, что я попробовал в первую очередь. Тоже не повезло.
3. Ну, независимо от результата, вы не должны использовать устаревший API, так что, может быть, покажите свою
getaddrinfo()
попытку?4. Как показано, оба предоставленных вами фрагмента кода должны были сработать. Кроме того,
ping
называетgetaddrinfo
себя, так что что-то вроде них действительно работает. Проблема должна быть в какой-то другой части программы. Пожалуйста, предоставьте полную программу , которая блокирует навсегда.