Шрифт:
Затем будем считать, что с адреса 198.6.38.100, порт 2000, приходит 170-байтовая дейтаграмма UDP, предназначенная для нашего сокета UDP с IP-адресом получателя 206.168.112.96. На рис. 14.2 показана вся информация, содержащаяся в структуре
Рис. 14.2. Изменение рис. 14.1 при завершении функции
Затемненными показаны поля, изменяемые функцией
В буфер, на который указывает элемент
Обновляется аргумент
Первые 100 байт данных записываются в первый буфер, следующие 60 байт — во второй буфер и последние 10 байт — в третий буфер. Последние 70 байт третьего буфера не изменяются. Возвращаемое значение функции
Буфер, на который указывает
Обновляется элемент
Элемент
В табл. 14.3 показаны различия между рассмотренными пятью группами функций ввода-вывода.
Таблица 14.3. Сравнение пяти групп функций ввода-вывода
Функция | Произвольный дескриптор | Только дескриптор сокета | Один буфер для чтения и записи | Распределяющее чтение, объединяющая запись | Наличие флагов | Указание адреса собеседника | Управляющая информация |
---|---|---|---|---|---|---|---|
read, write | • | • | |||||
readv, writev | • | • | |||||
recv, send | • | • | • | ||||
recvfrom, sendto | • | • | • | • | |||
recvmsg, sendsg | • | • | • | • | • |
14.6. Вспомогательные данные
Вспомогательные данные (ancillary data) можно отправлять и получать, используя элементы
В табл. 14.4 приводится обобщение различных вариантов применения вспомогательных данных, рассматриваемых в этой книге.
Таблица 14.4. Использование вспомогательных данных
Протокол | cmsg_level | cmsg_type | Описание |
---|---|---|---|
IPv4 | IPPROTO_IP | IP_RECVDSTADDR | Получает адрес получателя с дейтаграммой UDP |
IP_RECVIF | Получает индекс интерфейса с дейтаграммой UDP | ||
IPv6 | IPPROTO_IPV6 | IPV6_DSTOPTS | Задает/получает параметры получателя |
IPV6_HOPLIMIT | Задает/получает предел количества транзитных узлов | ||
IPV6_HOPOPTS | Задает/получает параметры для транзитных узлов | ||
IPV6_NEXTHOP | Задает следующий транзитный адрес | ||
IPV6_PKTINFO | Задает/получает информацию о пакете | ||
IPV6_RTHDR | Задает/получает информацию о пакете | ||
Домен Unix | SOL_SOCKET | SCM_RIGHTS | Посылает/получает дескрипторы |
SCM_CREDS | Посылает/получает данные, идентифицирующие пользователя |
Набор протоколов OSI также использует вспомогательные данные для различных целей, которые мы не рассматриваем в этой книге.
Вспомогательные данные состоят из одного или более объектов вспомогательных данных( ancillary data objects), каждый из которых начинается со структуры