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