Подтвердить что ты не робот

Как getaddrinfo() выполняет поиск DNS?

getaddrinfo() - это функция, которую мы должны использовать до, создавая сокет() или connect() ing, правильно? Тогда как getaddrinfo взаимодействует с DNS-сервером в первую очередь?

PS: Где я могу увидеть полный источник getaddrinfo?

4b9b3361

Ответ 1

Нет необходимости вызывать getaddrinfo() перед созданием сокета или подключения. Он используется для перевода имени домена, например stackoverflow.com, на IP-адрес, например 69.59.196.211. Если вы знаете IP-адрес, вы можете напрямую подключиться к этому адресу, и нет необходимости использовать getaddrinfo(). getaddrinfo() использует протокол DNS для разговора с вашими серверами имен, которые настроены с использованием их IP-адреса.

Исходный код glibc здесь.

Ответ 2

Имеется ли в вашей системе Unix файл /etc/nsswitch.conf? Если это так, то запись "hosts" дает порядок поиска для разрешения имен хостов на IP-адреса. У вашей системы есть файл /etc/resolv.conf? Если да, то он указывает, какие DNS-серверы использовать.

Как вы можете видеть, getaddrinfo() может сделать совсем немного (и может занять некоторое время)!

Ответ 3

Короткий ответ: "он запрашивает систему", который, в свою очередь, знает, как выполнять поиск в DNS и какие серверы использовать.

getaddrinfo() документируется справочной страницей getaddrinfo(3), что означает ее библиотечную функцию C. Это также функция POSIX, поэтому нет канонического "источника"; каждая стандартная библиотека C операционной системы, которая соответствует POSIX, будет реализовывать свою собственную версию. В любом случае, источник для этой функции, вероятно, не слишком просветляющий, поскольку он просто вызывает другие функции и API-интерфейсы ОС, и вам нужно будет развернуться довольно далеко, чтобы добраться до фактического механизма DNS. Вам будет лучше читать документацию о самом DNS-протоколе, если вы заинтересованы в том, как это работает.

Ответ 4

getaddrinfo() скорее всего делает вызов connect() за кулисами, однако он уже знает IP-адрес DNS-сервера, к которому ему нужно подключиться, чтобы запросить адрес хоста, с которым вы запрашиваете запрос. для.

getaddrinfo() требуется только, если вы хотите сопоставить "www.somehost.com" с IP-адресом, он не нужен в качестве праймера для вызова connect().

Возможно, вы найдете полный исходный код для getaddrinfo() в источниках glibc, которые вы сможете найти здесь (среди других мест).

Надеюсь, что это разъяснит вам.