Как getaddrinfo () выполняет поиск DNS? - PullRequest
21 голосов
/ 28 января 2010

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

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

Ответы [ 5 ]

10 голосов
/ 28 января 2010

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

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

8 голосов
/ 28 января 2010

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

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

7 голосов
/ 28 января 2010

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

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

1 голос
/ 28 января 2010

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

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

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

Надеюсь, что прояснит для вас.

0 голосов
/ 28 января 2010

Используется протокол DNS (UDP) http://www.freesoft.org/CIE/Topics/77.htm

...