Книга: UNIX: разработка сетевых приложений
11.10. Функция getaddrinfo: примеры
11.10. Функция getaddrinfo: примеры
Теперь мы покажем некоторые примеры работы функции getaddrinfo
, используя тестовую программу, которая позволяет нам вводить все параметры: имя узла, имя службы, семейство адресов, тип сокета и флаги AI_CANONNAME
и AI_PASSIVE
. (Мы не показываем эту тестовую программу, поскольку она содержит около 350 строк малоинтересного кода. Ее можно получить тем же способом, что и прочие исходные коды для этой книги.) Тестовая программа выдает информацию о переменном числе возвращаемых структур addrinfo
, показывая аргументы вызова функции socket
и адрес в каждой структуре адреса сокета. Сначала показываем тот же пример, что и на рис. 11.3:
freebsd % testga -f inet -c -h freebsd4 -s domain
socket(AF_INET, SOCK_DGRAM, 17) ai_canonname = freebsd4.unpbook.com
address: 135.197.17.100:53
socket(AF_INET, SOCK_DGRAM, 17)
address: 172:24.37.94:53
socket(AF_INET, SOCK_STREAM, 6) ai_canonname = freebsd4.unpbook.com
address: 135.197.17.100:53
socket(AF_INET, SOCK_STREAM, 6)
address: 172.24.37.94:53
Параметр -f inet
задает семейство адресов, -с указывает, что нужно возвратить каноническое имя, -h freebsd4
задает имя узла, -s domain
задает имя службы.
Типичный сценарий клиента — задать семейство адресов, тип сокета (параметр -t
), имя узла и имя службы. Следующий пример показывает это для узла с несколькими сетевыми интерфейсами с шестью адресами Ipv4:
freebsd % testga -f inet -t stream -h gateway.tuc.noao.edu -s daytime
socket(AF_INET, SOCK_STREAM, 6)
address: 140.252.108.1:13
socket(AF_INET, SOCK_STREAM, 6)
address: 140.252.1.4:13
socket(AF_INET, SOCK_STREAM, 6)
address: 140.252.104.1:13
socket(AF_INET, SOCK_STREAM, 0)
address: 140.252.3.6.13
socket(AF_INET, SOCK_STREAM, 0)
address: 140.252.4.100.13
socket(AF_INET, SOCK_STREAM, 0)
address: 140.252.1.4.13
Затем мы задаем наш узел aix
, у которого имеется и запись типа AAAA, и запись типа А, не указывая семейства адресов. Имя службы — ftp
, которая предоставляется только TCP.
freebsd % testga -h aix -s ftp -t stream
socket(AF_NET6, SOCK_STREAM, 6)
address: [3ffe:b80:1f8d:2:204:acff:fe17:bf38]:21
socket(AF_INET, SOCK_STREAM, 6)
address: 192.168.42.2:21
Поскольку мы не задали семейство адресов и запустили этот пример на узле, который поддерживает и IPv4, и IPv6, возвращаются две структуры: одна для IPv6 и одна для IPv4.
Затем мы задаем флаг AI_PASSIVE
(параметр -р
), не указываем ни семейства адресов, ни имени узла (подразумевая универсальный адрес), задаем номер порта 8888 и не указываем тип сокета.
freebsd % testga -р -s 8888 -t stream
socket(AF_INET6, SOCK_STREAM, 6)
address: [::]:8888
socket(AF_INET, SOCK_STREAM, 6)
address: 0.0.0.0:8888
Возвращаются две структуры. Поскольку мы запустили эту программу на узле, поддерживающем и IPv4, и IPv6, не задав семейства адресов, функция getaddrinfo
возвращает универсальный адрес IPv6 и универсальный адрес IPv4. Структура IPv6 возвращается перед структурой IPv4, поскольку, как мы увидим в главе 12, клиент или сервер IPv6 на узле с двойным стеком может взаимодействовать с собеседниками по IPv6 и по IPv4.
- 11.1. Введение
- 11.2. Система доменных имен
- 11.3. Функция gethostbyname
- 11.4 Функция gethostbyaddr
- 11.5. Функции getservbyname и getservbyport
- 11.6. Функция getaddrinfo
- 11.7. Функция gai_strerror
- 11.8. Функция freeaddrinfo
- 11.9. Функция getaddrinfo: IPv6
- 11.10. Функция getaddrinfo: примеры
- 11.11. Функция host_serv
- 11.12. Функция tcp_connect
- 11.13. Функция tcp_listen
- 11.14. Функция udp_client
- 11.15. Функция udp_connect
- 11.16. Функция udp_server
- 11.17. Функция getnameinfo
- 11.18. Функции, допускающие повторное вхождение
- 11.19. Функции gethostbyname_r и gethostbyaddr_r
- 11.20. Устаревшие функции поиска адресов IPv6
- 11.21. Другая информация о сетях
- 11.22. Резюме
- Упражнения
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- Примеры получения статистики
- 19.1.1. Функция jQuery()
- Примеры
- Функция strcmp( )
- Управление функциями узла
- Функция программного обеспечения
- 3.2. Ключи типа key_t и функция ftok
- 4.11.2. Примеры добавления ipchains-правил
- 4.11.3. Примеры удаления ipchains-правил
- 4.12.3. Примеры конфигурирования iptables