UNIX: разработка сетевых приложений, стр. 127
2. Если служба предоставляется для множества типов сокетов, то одна структура может быть возвращена для каждого типа сокета в зависимости от
ai_socktypegetaddrinfoai_socktypeai_socktypeНапример, если структура
hintsdomainaddrinfo■ одна для первого IP-адреса и типа сокета SOCK_STREAM;
■ одна для первого IP-адреса и типа сокета SOCK_DGRAM;
■ одна для второго IP-адреса и типа сокета SOCK_STREAM;
■ одна для второго IP-адреса и типа сокета SOCK_DGRAM.
Мы показываем схематическое изображение этого примера на рис. 11.3. Не существует никакого гарантированного порядка структур при возвращении множества элементов. Например, мы не можем считать, что службы TCP возвращаются перед службами UDP.

Рис. 11.3. Пример информации, возвращаемой функцией getaddrinfo
Хотя это и не гарантируется, реализация должна возвращать IP-адреса в том же порядке, в котором они возвращаются DNS. Некоторые распознаватели позволяют администратору указывать порядок сортировки адресов в файле /etc/resolv.conf. Протокол IPv6 определяет правила выбора адресов (RFC 3484 [28]), которые могут влиять на порядок адресов, возвращаемых getaddrinfo.
Информация, возвращаемая в структурах
addrinfosocketconnectsendtobindsocketai_familyai_socktypeai_protocolconnectbindai_addrgetaddrinfoai_addrlenЕсли в структуре
hintsAI_CANONNAMEai_canonnametelnetНа рис. 11.3 представлена возвращаемая информация для следующего вызова:
struct addrinfo hints, *res;bzero(&hints, sizeof(hints));hints.ai_flags = AI_CANONNAME;hints.ai_family = AF_INET;getaddrinfo("bsdi", "domain", &hints, &res);На этом рисунке все, кроме переменной
resmallocfreebsd4freebsd4.unpbook.comПорт 53 предназначен для службы
domainai_protocolgetaddrinfoai_protocolgetaddrinfoВ табл. 11.1 показано число структур
addrinfoai_socktypeТаблица 11.1. Число структур addrinfo, возвращаемых для каждого IP-адреса
| Элемент ai_socktype | Служба обозначена именем и предоставляется: | Служба обозначена именем порта | |||||
|---|---|---|---|---|---|---|---|
| Только TCP | Только UDP | Только SCTP | TCP и UDP | TCP и SCTP | TCP, UDP и SCTP | ||
| 0 | 1 | 1 | 1 | 2 | 2 | 3 | Ошибка |
| SOCK_STREAM | 1 | Ошибка | 1 | 1 | 2 | 2 | 2 |
| SOCK_DGRAM | Ошибка | 1 | 1 | Ошибка | 1 | 1 | |
| SOCK_SEQPACKET | Ошибка | Ошибка | 1 | Ошибка | 1 | 1 | 1 |
Более одной структуры
addrinfoai_socktypehints/etc/services