содержит количество непрочитанных порций данных, подготовленных локальной конечной точкой SCTP для приложения;
sstat_instrms
содержит количество потоков, используемых собеседником для передачи данных на данную конечную точку;
sstat_outstrms
содержит количество потоков, по которым данная конечная точка может передавать данные собеседнику;
sstat_fragmentation_point
содержит текущее значение границы фрагментации пользовательских сообщений, используемое локальной конечной точкой SCTP. Это значение обычно равняется минимальной MTU для всех адресатов или еще меньшей величине, установленной при помощи параметра
SCTP_MAXSEG
;
sstat_primary
содержит
текущий основной адрес. Основной адрес используется по умолчанию для отправки данных собеседнику.
Таблица 7.8. Состояния SCTP
Константа
Описание
SCTP_CLOSED
Ассоциация закрыта
SCTP_COOKIE_WAIT
Ассоциация отправила пакет INIT
SCTP_COOKIE_ECHOED
Ассоциация отправила эхо-ответ cookie
SCTP_ESTABLISHED
Ассоциация установлена
SCTP_SHUTDOWN_PENDING
Ассоциация ждет отправки сообщения о завершении
SCTP_SHUTDOWN_SENT
Ассоциация отправила сообщение о завершении
SCTP_SHUTDOWN_RECEIVED
Ассоциация получила сообщение о завершении
SCTP_SHUTDOWN_ACK_SENT
Ассоциация ждет пакета SHUTDOWN-COMPLETE
Эти параметры полезны для диагностики соединения и определения характеристик текущего сеанса. Например, функция
sctp_get_no_strms
в разделе 10.2 будет считывать
sstat_outstrms
для определения количества доступных для отправки данных потоков. Низкое значение
sstat_rwnd
или высокое значение
sstat_unackdata
позволяет сделать вывод о заполнении приемного буфера собеседника, так что приложение может вовремя замедлить передачу данных. Поле
sstat_fragmentation_point
может использоваться некоторыми приложениями для уменьшения количества пакетов, создаваемых SCTP, путем уменьшения размеров сообщений.
7.11. Функция fcntl
Сокращение
fcntl
означает «управление файлами» (file control). Эта функция выполняет различные операции управления дескрипторами. Перед описанием этой функции и ее влияния на сокет нам нужно составить некоторое более общее представление о ее возможностях. В табл. 7.9 приводятся различные операции, выполняемые функциями
fcntl
и
ioctl
и маршрутизирующими сокетами.
Таблица 7.9. Операции функций fcntl и ioctl и маршрутизирующих сокетов
Операция
fcntl
ioctl
Маршрутизирующий сокет
Posix.1g
Установка сокета для неблокируемого ввода-вывода
F_SETFL, O_NONBLOCK
FIONBIO
fcntl
Установка сокета для ввода-вывода, управляемого сигналом
F_SETFL, O_ASYNC
FIOASYNC
fcntl
Установка владельца сокета
F_SETOWN
SIOCSPGRP или FIOSETOWN
fcntl
Получение владельца сокета
F_GETOWN
SIOCGPGRP или FIOGETOWN
fcntl
Получение
текущего количества байтов в приемном буфере сокета
FIONREAD
Проверка, находится ли процесс на отметке внеполосных данных
SIOCATMARK
sockatmark
Получение списка интерфейсов
SIOCGIFCONF
Sysctl
Операции интерфейсов
SIOC[GS]IF xxx
Кэш-операции ARP
SIOC xARP
RTM_ xxx
Операции таблицы маршрутизации
SIOG xxxRT
RTM_ xxx
Первые шесть операций могут применяться к сокетам любым процессом, следующие две (операции над интерфейсами) используются реже, а последние две (ARP и таблица маршрутизации) выполняются администрирующими программами, такими как
ifconfig
и
route
. О различных операциях функции
ioctl
мы поговорим подробнее в главе 17, а о маршрутизирующих сокетах — в главе 18.
Существует множество способов выполнения первых четырех операций, но, как указано в последней колонке, стандарт POSIX определяет, что функция
fcntl
является предпочтительным способом. Отметим также, что POSIX предлагает функцию
sockatmark
(см. раздел 24.3) как наиболее предпочтительный способ тестирования на предмет пребывания процесса на отметке внеполосных данных. Оставшиеся операции с пустой последней колонкой не стандартизованы POSIX.
ПРИМЕЧАНИЕ
Отметим также, что первые две операции, устанавливающие сокет для неблокируемого ввода-вывода и для ввода-вывода, управляемого сигналом, традиционно применялись с использованием команд FNDELAY и FASYNC функции fcntl. POSIX определяет константы О_ xxx.
Функция
fcntl
предоставляет следующие возможности, относящиеся к сетевому программированию:
Неблокируемый ввод-вывод. Мы можем установить флаг состояния файла
O_NONBLOCK
, используя команду
F_SETFL
для отключения блокировки сокета. Неблокируемый ввод-вывод мы описываем в главе 16.
Управляемый сигналом ввод-вывод. Мы можем установить флаг состояния файла
O_ASYNC
, используя команду
F_SETFL
, после чего при изменении состояния сокета будет генерироваться сигнал SIGIO. Мы рассмотрим это в главе 25.
Команда
F_SETOWN
позволяет нам установить владельца сокета (идентификатор процесса или идентификатор группы процессов), который будет получать сигналы
SIGIO
и
SIGURG
. Первый сигнал генерируется, если для сокета включен управляемый сигналом ввод-вывод (см. главу 25), второй — когда для сокета приходят новые внеполосные (out-of-band data) данные (см. главу 24). Команда
F_GETOWN
возвращает текущего владельца сокета.
ПРИМЕЧАНИЕ
Термин «владелец сокета» определяется POSIX. Исторически реализации, происходящие от Беркли, называли его «идентификатор группы процессов сокета», потому что переменная, хранящая этот идентификатор, — это элемент so_pgid структуры socket [128, с. 438].