getaddrinfo () является функцией, которую мы должны использовать прежде, чем создать сокет () или подключение () луг, правильно? Тогда, как getaddrinfo связывается с сервером DNS во-первых?
PS: Где я могу видеть полный источник getaddrinfo?
Есть ли в вашей Unix-системе файл /etc/nsswitch.conf? Если да, то запись "hosts" дает порядок поиска для преобразования имен хостов в IP-адреса. Есть ли в вашей системе файл /etc/resolv.conf? Если да, то он указывает, какие DNS-серверы использовать.
Как видите, функция getaddrinfo() может сделать довольно много (и может занять некоторое время)!
Нет необходимости вызывать getaddrinfo()
перед созданием сокета или соединением. Она используется для перевода доменного имени, такого как stackoverflow.com, на IP-адрес, такой как 69.59.196.211. Если вы знаете IP-адрес, то вы можете подключиться непосредственно к этому адресу, и нет необходимости использовать getaddrinfo()
. getaddrinfo()
использует протокол DNS для связи с вашими серверами имен, которые настроены с использованием их IP адреса.
getaddrinfo()
скорее всего сделает вызов connect()
за кулисами, однако он уже знает IP-адрес DNS-сервера, с которым он должен соединиться, чтобы сделать запрос на адрес хоста, который вы просите его запросить.
getaddrinfo()
требуется только в том случае, если вы хотите сопоставить "www.somehost.com" с IP-адресом, он не нужен в качестве праймера для вызова connect()
.
Вероятно, вы можете найти полный исходный код для getaddrinfo()
в исходниках glibc, которые вы сможете найти здесь (среди прочих мест).
Надеюсь, это прояснит вам ситуацию.
Короткий ответ: " он запрашивает систему", который, в свою очередь, знает, как делать DNS поиск и какие серверы использовать.
getaddrinfo()
документируется страницей руководства getaddrinfo(3)
, что означает, что это функция библиотеки Си. Это также POSIX функция, так что нет никакого канонического "исходного текста"; каждая стандартная библиотека Си операционной системы, которая соответствует POSIX, реализует свою собственную версию. В любом случае исходный текст только этой функции, вероятно, не слишком поучительен, так как он будет просто вызывать другие функции и API операционной системы, и вам придётся довольно далеко углубиться, чтобы добраться до реального механизма DNS. Лучше прочитать документацию по самому протоколу DNS, если вам интересно, как он работает.
Используется протокол DNS (UDP) http://www.freesoft.org/cie/topics/77.htm