2015-05-05 2 views
-2

кодекса следующим образом:gethostbyaddr() возвращает NULL, но ERRNO результат УСПЕХА

struct sockaddr_in ipv4addr; 
ipv4addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
struct hostent *he; 
he = gethostbyaddr(&ipv4addr, sizeof(ipv4addr), AF_INET); 
if(he) 
    printf("Host name: %s\n", he->h_name); 
else 
    printf("Error AHAHA:%s\n", strerror(errno)); 

Но это ясно говорит, что

Возвращаемое значение

gethostbyname() и gethostbyaddr() возвращают hostent или указатель NULL, если возникает ошибка. При ошибке в переменной h_errno содержится номер ошибки. Если значение не равно NULL, возвращаемое значение может быть указывает на статические данные, см. Примечания ниже.

Этот фрагмент кода результата при печати Ахаха Ошибка: УСПЕХ, и это также означает, что работать в другой, что указывает на он является NULL, не должно быть.

UPDATE:

memset(&ipv4addr,0,sizeof(ipv4addr)); 
ipv4addr.sin_family = AF_INET; 

добавляя их я как-то получил имя хоста

ANantes-651-1-49-net.w2-0.abo.wanadoo.fr(2.0.0.0)??? 
+0

И ... что вы на самом деле видите? Есть вопрос? – BadZen

+4

Он говорит прямо в документации, 'h_errno' содержит номер ошибки. Тем не менее, в вашем коде вы проверяете 'errno'. Голосование вне темы, потому что ошибка вызвана простой опечаткой. –

+0

А, я вижу, УСПЕХ - вот выход страха. Да.^это. – BadZen

ответ

0

Я до сих пор не знаю, почему я получаю другие имена хостов, но это работает для меня

char ipv4addr[sizeof(struct in_addr)]; 
inet_pton(AF_INET, "127.0.0.1", ipv4addr); 
struct hostent *he; 
he = gethostbyaddr(&ipv4addr, sizeof(ipv4addr), AF_INET); 
if(he) 
    printf("Host name: %s\n", he->h_name); 
else 
    printf("Error AHAHA:%s\n", hstrerror(h_errno)); 

И да, я изменил strerror (errno) до hstrerror (h_errno)

2

Как уже сказано в комментариях, то gethostby...() функции присвоить код ошибки h_errno, а не errno. Это не одно и то же! Вы также можете использовать gethostbyaddr_r(), чтобы получить код ошибки. Но в любом случае используйте hstrerror() вместо strerror(), чтобы сообщить об ошибке.

Вы также не заселяете поле sockaddr_in.sin_family. Вот почему код работает с использованием inet_pton(). Несмотря на то, что gethostbyaddr() берет семейство в качестве входного параметра, вам все равно нужно передать его правильно заполненному sockaddr_in, чтобы он мог проверить, что вы действительно передаете IPv4-адрес, а не другой тип адреса, например IPv6.

Попробуйте это:

struct sockaddr_in ipv4addr; 
memset(&ipv4addr, 0, sizeof(ipv4addr)); 
ipv4addr.sin_family = AF_INET; 
ipv4addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
struct hostent *he = gethostbyaddr(&ipv4addr, sizeof(ipv4addr), AF_INET); 
if(he) 
    printf("Host name: %s\n", he->h_name); 
else 
    printf("Error AHAHA:%s\n", hstrerror(h_errno)); 
Смежные вопросы