Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:
AF_INET6 Неявный адрес 0::1 Одна структура sockaddr_in6{} inet_pton(AF_INET6) AF_INET Неявный адрес 127.0.0.1 Одна структура sockaddr_in{} inet_pton(AF_INET)

Обратите внимание, что табл. 11.3 описывает только обработку адресов IPv4 и IPv6 функцией

getaddrinfo
, то есть количество и тип адресов, возвращаемых процессу в различных ситуациях. Реальное количество структур
addrinfo
зависит также от типа сокета и имени службы, о чем уже говорилось в связи с табл. 11.1.

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

  • Читать дальше
  • 1
  • ...
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: