UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
2. Если служба предоставляется для множества типов сокетов, то одна структура может быть возвращена для каждого типа сокета в зависимости от
ai_socktype
getaddrinfo
ai_socktype
ai_socktype
Например, если структура
hints
domain
addrinfo
■ одна для первого 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.
Информация, возвращаемая в структурах
addrinfo
socket
connect
sendto
bind
socket
ai_family
ai_socktype
ai_protocol
connect
bind
ai_addr
getaddrinfo
ai_addrlen
Если в структуре
hints
AI_CANONNAME
ai_canonname
telnet
На рис. 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);
На этом рисунке все, кроме переменной
res
malloc
freebsd4
freebsd4.unpbook.com
Порт 53 предназначен для службы
domain
ai_protocol
getaddrinfo
ai_protocol
getaddrinfo
В табл. 11.1 показано число структур
addrinfo
ai_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 |
Более одной структуры
addrinfo
ai_socktype
hints
/etc/services