UNIX: разработка сетевых приложений
connect error: Operation timed outtrying 140.252.1.4:13connect error: Operation timed outtrying 140.252.104.1:13connect error: Connection refusedunable to connect11.6. Функция getaddrinfo
Функции
иgethostbynameподдерживают только IPv4. Интерфейс IPv6 разрабатывался в несколько этапов (история разработки описана в разделе 11.20), и в конечном итоге получилась функцияgethostbyaddr. Последняя осуществляет трансляцию имен в адреса и служб в порты, причем возвращает она список структурgetaddrinfo, а не список адресов. Такие структуры могут непосредственно использоваться функциями сокетов. Благодаря этому функцияsockaddrскрывает все различия между протоколами в библиотеке функций. Приложение работает только со структурами адресов сокетов, которые заполняютсяgetaddrinfo. Эта функция определяется стандартом POSIX.getaddrinfoПРИМЕЧАНИЕОпределение этой функции в POSIX происходит от более раннего предложения Кейта Склоуэра (Keith Sklower) для функции, называемой getconninfo. Эта функция стала результатом обсуждений с Эриком Олменом (Eric Allman), Вилльямом Дастом (William Durst), Майклом Карелсом (Michael Karels) и Стивеном Вайсом (Steven Wise), а также более ранней реализации, написанной Эриком Олменом. Замечание о том, что указания имени узла и имени службы достаточно для соединения с этой службой независимо от деталей протокола, было сделано Маршалом Роузом (Marshall Rose) в проекте X/Open.
#include <netdb.h>int getaddrinfo(const char *<i>hostname</i>, const char *<i>service</i>,const struct addrinfo *<i>hints</i>, struct addrinfo **<i>result</i>);<i>Возвращает: 0 в случае успешного выполнения, ненулевое значение в случае ошибки</i><i>(см. табл. 11.2).</i>Через указатель
функция возвращает указатель на связный список структурresult, который задается в заголовочном файлеaddrinfo:<netdb.h>struct addrinfo {int ai_flags; /* AI_PASSIVE, AI_CANONNAME */int ai_family; /* AF_xxx */int ai_socktype; /* SOCK_xxx */int ai_protocol; /* 0 или IPPROTO_xxx для IPv4 и IPv6 */size_t ai_addrlen; /* длина ai_addr */char* ai_canonname; /* указатель на каноническое имя узла */struct sockaddr *ai_addr; /* указатель на структуру адреса сокета */struct addrinfo *ai_next; /* указатель на следующую структуру в связномсписке */};Переменная
— это либо имя узла, либо строка адреса (точечно-десятичная запись для IPv4 или шестнадцатеричная строка для IPv6). Переменнаяhostname— это либо имя службы, либо строка, содержащая десятичный номер порта. (См. также упражнение 11.4.)serviceАргумент
— это либо пустой указатель, либо указатель на структуруhints, заполненную рекомендациями вызывающего процесса о типах информации, которую он хочет получить. Например, если заданная служба предоставляется и для TCP, и для UDP (службаaddrinfo, которая ссылается на сервер DNS), вызывающий процесс может присвоить элементуdomainструктурыai_socktypeзначениеhints. Тогда возвращение информации будет иметь место только для дейтаграммных сокетов.SOCK_DGRAMВызывающим процессом могут быть установлены значения следующих элементов структуры
:hints■
(несколько константai_flags, объединенных операцией ИЛИ);AI_XXX■
(значениеai_family);AF_xxx■
(значениеai_socktype);SOCK_xxx■
.ai_protocolПоле
может содержать следующие константы:ai_flags■
указывает, что сокет будет использоваться для пассивного открытия;AI_PASSIVE■
указывает функции на необходимость возвратить каноническое имя узла;AI_CANONNAME■
запрещает преобразование между именами и адресами. АргументAI_NUMERICHOSTдолжен представлять собой строку адреса;hostname■
запрещает преобразование между именами служб и номерами портов. АргументAI_NUMERICSERVдолжен представлять собой строку с десятичным номером порта;service■
вместе сAI_V4MAPPEDуказывает функции на необходимость вернуть адреса IPv4 из записей А, преобразованные к IPv6, если записи типа AAAA отсутствуют;ai_family = AF_INET6■
при указании вместе сAI_ALLговорит о необходимости вернуть адреса IPv4, преобразованные к IPv6, вместе с истинными адресами IPv6;AI_V4MAPPED■
возвращает адреса, относящиеся к заданной версии IP, когда имеется несколько интерфейсов, имеющих IP-адреса другой версии.AI_ADDRCONFIGЕсли аргументом структуры
является пустой указатель, функция подразумевает нулевое значение дляhints,ai_flagsиai_socktypeи значениеai_protocolдляAF_UNSPEC.ai_familyЕсли функция завершается успешно (0), то в переменную, на которую указывает аргумент
, записывается указатель на список структурresult, связанных через указательaddrinfo. Имеется два способа возвращения множественных структур.ai_next1. Если существует множество адресов, связанных с узлом
, то одна структура возвращается для каждого адреса, который может использоваться с запрашиваемым семейством адресов (значениеhostname, если задано).ai_family