Почему getaddrinfo возвращает сервисные порты, даже если на сервере такой сервис не запущен? - PullRequest
1 голос
/ 24 октября 2019

С учетом имени хоста и имени службы, getaddrinfo() возвращает список структур адресов сокетов, каждая из которых содержит IP-адрес и номер порта.

Использование: getaddrinfo("stackoverflow.com", "https", &hint, &ailist)

Но, похоже, getaddrinfo не проверяет, работает ли служба на сервере или нет. Ни один не проверяет порт. Он просто возвращает любой порт по умолчанию.

Например, даже если на моем сервере не запущена служба http или https, он возвращает порты 80 и 443. А для другого сервера ssh работает на порту 27000, но он также возвращает порт по умолчанию 22.

Так в чем смысл вызова getaddrinfo? Кажется, только сделать разрешение DNS.

(Я очень смущен. Функциональность функции не совпадает с ее именем ...)

Полный пример. https://www.onlinegdb.com/HJfEGOcRtS
(Вы можете разветвить фрагмент кода и попробовать с другими аргументами времени выполнения.)

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Функция getaddrinfo не предназначена для проверки работоспособности определенной службы. Он выполняет поиск имени как по данному имени хоста , так и по заданному имени службы, заполняя структуру struct sockaddr, подходящую для подключения, отправки или привязки к паре IP / порт.

Часть поиска имени хоста выполняет типичную проверку файла локального хоста, а также DNS-сервера. Поиск имени службы проверяет файл / etc / services, чтобы получить номер порта, связанный с указанной службой. Например, в этом файле вы найдете следующую запись:

https           443/tcp

Таким образом, массив ailist будет содержать записи с IP-адресом (ами) stackoverflow.com и портом 443. Затем вы можетепередайте один из этих struct sockaddr экземпляров connect для подключения к этой службе.

1 голос
/ 24 октября 2019

Да, с соответствующей справочной страницы (http://man7.org/linux/man-pages/man3/getaddrinfo.3.html):

"The getaddrinfo() function combines the functionality provided by
the gethostbyname(3) and getservbyname(3)"

То есть host lookup (который может быть из / etc / hosts, затем DNS, в зависимости отваш конфиг) и сервисный порт поиск, обычно из / etc / services, но может быть из других баз данных.

Для этих адресов и портов не требуется никаких вещей,это строго поиск по базе данных.

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