В этом примере рассматривается последовательный сервер, один программный поток которого обрабатывает сообщения, полученные через несколько ассоциаций. SCTP позволяет использовать сокет типа «один-ко-многим» с функцией sctp_peeloff
1. Функция sctp_peeloff
2. Полученный таким образом сокет типа «один-к-одному» может быть передан новому потоку или порожденному процессу (как в модели параллельного сервера).
3. Основной поток обрабатывает сообщения от всех остальных ассоциаций в последовательном режиме.
Сокет SCTP типа «один-ко-многим» является IP-сокетом (семейство AF_INET
AF_INET6
) со значением типа SOCK_SEQPACKET
и значением протокола IPPROTO_SCTP
.9.3. Функция sctp_bindx
Сервер SCTP может привязаться к некоторому подмножеству IP-адресов узла, на котором он запущен. Серверы TCP и UDP могли привязываться либо к одному, либо ко всем адресам узла, но не могли указывать конкретный набор адресов. Функция sctp_bindx
#include
int sctp_bindx(int
Аргумент sockfd
socket
. Второй аргумент — указатель на упакованный список адресов. Каждая структура адреса сокета помещается в буфер непосредственно после предшествующей структуры, без всяких дополняющих нулей (пример приводится на рис. 9.3).Рис. 9.3
. Формат упакованного списка адресов для функций SCTPКоличество адресов, передаваемых sctp_bindx
addrcnt
. Параметр flags
сообщает функции sctp_bindx
о необходимости выполнения действий, перечисленных в табл. 9.1.Таблица 9.1
. Флаги функции sctp_bindxЗначение аргумента flags | Описание |
---|---|
SCTP_BINDX_ADD_ADDR | Добавляет адреса к уже определенным для сокета |
SCTP_BINDX_REM_ADDR | Удаляет адреса из списка адресов сокета |
Функцию sctp_bindx
sctp_bindx
приведет к привязке указанного набора адресов. При работе с уже связанным сокетом указание флага SCTP_BINDX_ADD_ADDR
позволяет добавить адреса к данному дескриптору. Флаг SCTP_BINDX_REM
_ADDR предназначен для удаления адресов из списка связанных с данным дескриптором. Если sctp_bindx
вызывается для прослушиваемого сокета, новая конфигурация будет использоваться только для новых ассоциаций; вызов никак не затронет уже установленные ассоциации. Флаги sctp_bindx
взаимно исключают друг друга: если указать оба, функция вернет ошибку EINVAL
. Номер порта во всех структурах адреса сокета должен быть одним и тем же. Он должен совпадать с тем номером порта, который был связан с данным сокетом ранее. В противном случае sctp_bindx
тоже вернет ошибку EINVAL
.Если конечная точка поддерживает динамическую адресацию, вызов sctp_bindx с флагом SCTP_BINDX_REM_ADDR
SCTP_BINDX_ADD_ADDR
приведет к передаче собеседнику сообщения о необходимости изменения списка адресов. Поскольку изменение списка адресов для установленной ассоциации не является обязательным, реализации, не поддерживающие эту функцию, будут при попытке ее использования возвращать ошибку EOPNOTSUPP
. Обратите внимание, что для нормальной работы динамической адресации она должна поддерживаться обеими сторонами. Все это полезно в том случае, если система поддерживает динамическое предоставление интерфейсов: когда открывается доступ к новому интерфейсу Ethernet, приложение может вызвать SCTP_BINDX_ADD_ADDR
и начать работать с этим интерфейсом по уже установленным ассоциациям.9.4. Функция sctp_connectx
#include
int sctp_connectx(int