Чтение онлайн

на главную - закладки

Жанры

UNIX: разработка сетевых приложений
Шрифт:
ПРИМЕЧАНИЕ

Можно возразить, что если в качестве семейства протоколов задано AF_INET6, строка в точечно-десятичной записи должна возвращаться как адрес IPv4, преобразованный к виду IPv6 в структуре sockaddr_in6. Но другим способом получения этого результата является установка префикса строки с десятичной точкой 0::ffff:.

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

getaddrinfo
. Колонка «Результат» отражает то, что мы хотим возвратить вызывающему процессу, если входные переменные таковы, как показано в первых трех колонках. Колонка «Действия» — то, каким образом мы получаем этот результат.

Таблица 11.3.

Функция getaddrinfo: ее действия и результаты

Имя узла, указанное вызывающим процессом Семейство адресов, указанное вызывающим процессом Строка с именем узла содержит Результат Действия
Ненулевая строка с именем узла; активное или пассивное открытие AF_UNSPEC Имя узла Все записи AAAA возвращаются как структуры sockaddr_in6{} и все записи А возвращаются как структуры sockaddr_in{} Поиск по записям AAAA и поиск по записям A
Шестнадцатеричная строка Одна структура sockaddr_in6{} inet_pton(AF_INET6)
Строка в точечно- десятичной записи Одна структура sockaddr_in{} inet_pton(AF_INET)
AF_INET6 Имя узла Все записи AAAA возвращаются как структуры sockaddr_in6{} либо все записи А возвращаются как структуры sockaddr_in6{} с адресами IPv4, преобразованными к виду IPv6 Поиск по записям AAAA
Шестнадцатеричная строка Одна структура sockaddr_in6{} inet_pton(AF_INET6)
Строка в точечно-десятичной записи Ищется как имя узла
AF_INET Имя узла Все записи А возвращаются как структуры sockaddr_in{} Поиск по записям типа A
Шестнадцатеричная строка Ошибка: EAI_ADDRFAMILY
Строка в точечно-десятичной записи Одна структура sockaddr_in{} inet_pton(AF_INET)
Пустая строка с именем узла; пассивное открытие AF_UNSPEC Неявный адрес 0::0 Неявный адрес 0.0.0.0 Одна структура sockaddr_in6{} и одна структура sockaddr_in{} inet_pton(AF_INET6) inet_pton(AF_INET)
AF_INET6 Неявный адрес 0::0 Одна структура sockaddr_in6{} inet_pton(AF_INET6)
AF_INET Неявный адрес 0.0.0.0 Одна структура sockaddr_in{} inet_pton(AF_INET)
Пустая строка с именем узла; активное открытие AF_UNSPEC Неявный адрес 0::1 Неявный адрес 127.0.0.1 Одна структура sockaddr_in6{} и одна структура sockaddr_in{} inet_pton(AF_INET6) inet_pton(AF_INET)
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.

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

Менталист. Эмансипация

Еслер Андрей
1. Выиграть у времени
Фантастика:
альтернативная история
7.52
рейтинг книги
Менталист. Эмансипация

Кодекс Охотника. Книга V

Винокуров Юрий
5. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.50
рейтинг книги
Кодекс Охотника. Книга V

Виконт. Книга 1. Второе рождение

Юллем Евгений
1. Псевдоним `Испанец`
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.67
рейтинг книги
Виконт. Книга 1. Второе рождение

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Месть Паладина

Юллем Евгений
5. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Месть Паладина

Новый Рал

Северный Лис
1. Рал!
Фантастика:
фэнтези
попаданцы
5.70
рейтинг книги
Новый Рал

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Прометей: владыка моря

Рави Ивар
5. Прометей
Фантастика:
фэнтези
5.97
рейтинг книги
Прометей: владыка моря

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.80
рейтинг книги
Тринадцатый

Мастер темных Арканов

Карелин Сергей Витальевич
1. Мастер темных арканов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мастер темных Арканов

Дайте поспать! Том II

Матисов Павел
2. Вечный Сон
Фантастика:
фэнтези
постапокалипсис
рпг
5.00
рейтинг книги
Дайте поспать! Том II

Возрождение Феникса. Том 1

Володин Григорий Григорьевич
1. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.79
рейтинг книги
Возрождение Феникса. Том 1

Его темная целительница

Крааш Кира
2. Любовь среди туманов
Фантастика:
фэнтези
5.75
рейтинг книги
Его темная целительница