Почему gethostbyname () не работает на несуществующих именах хостов? - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь получить IPv4-адрес от имени хоста, поэтому я подумал, что могу использовать gethostbyname () для этой цели.Это работает довольно хорошо, но есть одна проблема: он не перестает работать, когда ему передается несуществующее имя хоста.

Вот код:

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    printf("%p\n", gethostbyname("fkldsjflkasdjflkajsdflkjasdf.com"));
    return 0;
}

В Ubuntu вывод:

0x7fb891c1b8a0

Почему это не NULL?

* РЕДАКТИРОВАТЬ *

Вот более полный пример, который выводит результат:

#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char **argv)
{
    struct hostent *hp = gethostbyname("fkldsjflkasdjflkajsdflkjasdf.com");

    printf("%s %d %d %p\n", hp->h_name, hp->h_addrtype, hp->h_length, hp->h_addr_list);
    printf("%s\n", inet_ntoa(*((struct in_addr *) hp->h_addr)));

    return 0;
}

Результат таков:

fkldsjflkasdjflkajsdflkjasdf.com 2 4 0x1c141a0
62.138.238.45

AsВы можете видеть, я даже могу получить IP-адрес для несуществующего имени хоста!Понятия не имею, как это возможно ...

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Это похоже на проблему DNS-сервера, который вы используете.Он не возвращает ничего полезного, когда я запускаю код.

Учитывая, что поиск в Whois для возвращенного IP-адреса 62.138.238.45 включает описание www.t-online.de Я предполагаю, что вы используете доступ в Интернет, предоставленный Deutsche Telekom (T-Online), и что вы используете по умолчаниюсервер имен от T-Online.Этот сервер имен не будет возвращать NXDOMAIN для доменов, которые не существуют, но вместо этого предоставит IP-адрес, который приводит к «полезной» ошибке - т.е. рекламе.

Короткий тест с ручным обращением к HTTP-серверу по этому IP-адресу и использованием соответствующего домена в заголовке Host показывает следующее:

$ telnet 62.138.238.45 80
GET / HTTP/1.0 
Host: fkldsjflkasdjflkajsdflkjasdf.com
<newline>

В результате:

HTTP/1.1 302 Found
Date: Sun, 30 Dec 2018 19:42:04 GMT
Server: Apache/2.4.7 (Ubuntu)
Location: http://navigationshilfe1.t-online.de/dnserror?url=fkldsjflkasdjflkajsdflkjasdf.com/
Content-Length: 267
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://navigationshilfe1.t-online.de/dnserror?url=fkldsjflkasdjflkajsdflkjasdf.com/">here</a>.</p>
</body></html>

Для получения дополнительной информации об этой «услуге», а также информации о ее отключении см. эту информацию (на немецком языке).

0 голосов
/ 30 декабря 2018

Что содержит h_errno?Это должно быть HOST_NOT_FOUND

gethostbyname возвращает только ноль, если происходит внутренняя ошибка, то есть он не может выделить память для структуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...