getaddrinfo разрешает имя хоста неправильно

Я пытаюсь использовать функцию getaddrinfo (http://man7.org/linux/man-pages/man3/getaddrinfo.3.html) чтобы получить in_addr структуру IP-адреса, но, насколько я вижу, что-то не так, или я делаю что-то не так. Рассмотрим следующий фрагмент кода.

bool resolve_host (string hostname, in_addr* address) {
cout << "hostname  = " << hostname << endl;
addrinfo *res {};

addrinfo hints {0, AF_INET, 0, 0, 0, nullptr, nullptr, nullptr};

auto result = getaddrinfo (hostname.c_str (), nullptr, &hints, &res);
if (!result) {
memcpy (address, &((struct sockaddr_in*) res->ai_addr)->sin_addr, sizeof (in_addr));
freeaddrinfo (res);

cout << "resolved addr = " << inet_ntoa (*address) << endl << endl;

return true;
}
else {
return false;
}
}

С использованием, как это:

in_addr addr {};
resolve_host ("www.google.pl", &addr);      // 1
resolve_host ("linux-1smb", &addr);         // 2
resolve_host ("192.168.100.100", &addr);    // 3
resolve_host ("192.168.100.1001", &addr);   // 4

resolve_host ("wrong_name", &addr);         // 5

Вывод выглядит так:

hostname  = www.google.pl
resolved addr = 74.125.71.94

hostname  = linux-1smb
resolved addr = 192.168.0.101

hostname  = 192.168.100.100
resolved addr = 192.168.100.100

hostname  = 192.168.100.1001
hostname  = wrong_name
resolved addr = 217.74.65.145

Первые четыре звонка действуют как задумано. Конечно, существует предположение, что linux-1smb является известным именем хоста (добавлено в / etc / hosts). Но последний (5) вызов показывает, что имя хоста «неправильное имя» (которое, конечно, не добавлено в / etc / hosts) имеет IP-адрес 217.74.65.145.

Не могли бы вы сказать мне, где у меня ошибка (в коде, или понимание того, как работает getaddrinfo)?

Содержимое / etc / hosts:

#
# hosts         This file describes a number of hostname-to-address
#               mappings for the TCP/IP subsystem.  It is mostly
#               used at boot time, when no name servers are running.
#               On small systems, this file can be used instead of a
#               "named" name server.
# Syntax:
#
# IP-Address  Full-Qualified-Hostname  Short-Hostname
#

127.0.0.1       localhost

# special IPv6 addresses
::1             localhost ipv6-localhost ipv6-loopback

fe00::0         ipv6-localnet

ff00::0         ipv6-mcastprefix
ff02::1         ipv6-allnodes
ff02::2         ipv6-allrouters
ff02::3         ipv6-allhosts
192.168.0.101   linux-1smb
225.0.0.37      multi-test

Стоит упомянуть, если я изменю подсказки, на это:

addrinfo hints {0, AF_UNSPEC, 0, 0, 0, nullptr, nullptr, nullptr};

который (насколько я знаю — из документации) равен:

getaddrinfo (hostname.c_str (), nullptr, nullptr, &res);

Результат четвертого звонка:

hostname  = 192.168.100.1001
resolved addr = 217.74.65.145

Какой тот же IP-адрес, как в случае вызова 5.

Возможное решение:

Я прочитал в комментарии некоторые возможные ситуации, и я проверил это. Оказывается, что адрес 217.74.65.145 — это адрес моего провайдера, который в основном перенаправляет все неизвестные имена хостов (например, из браузера) в этот адрес. Я думаю, вот почему getaddrinfo возвращает этот адрес. Я до сих пор не знаю, как это решить, но теперь я теперь, почему это происходит.

Спасибо

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]