Книга: UNIX: разработка сетевых приложений
9.3. Функция sctp_bindx
9.3. Функция sctp_bindx
Сервер SCTP может привязаться к некоторому подмножеству IP-адресов узла, на котором он запущен. Серверы TCP и UDP могли привязываться либо к одному, либо ко всем адресам узла, но не могли указывать конкретный набор адресов. Функция sctp_bindx
делает программирование приложений более гибким, предоставляя возможность связывать сокет SCTP с заданными адресами.
#include <netinet/sctp.h>
int sctp_bindx(int sockfd, const struct sockaddr *addrs, int addrcnt, int flags);
Возвращает: 0 в случае успешного завершения, -1 в случае ошибки
Аргумент 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.1. Введение
- 9.2. Модели интерфейса
- 9.3. Функция sctp_bindx
- 9.4. Функция sctp_connectx
- 9.5. Функция sctp_getpaddrs
- 9.6. Функция sctp_freepaddrs
- 9.7. Функция sctp_getladdrs
- 9.8. Функция sctp_freeladdrs
- 9.9. Функция sctp_sendmsg
- 9.10. Функция sctp_recvmsg
- 9.11. Функция sctp_opt_info
- 9.12. Функция sctp_peeloff
- 9.13. Функция shutdown
- 9.14. Уведомления
- 9.15. Резюме
- Упражнения
- 9.8. Функция sctp_freeladdrs
- Глава 9 Основы сокетов SCTP
- 9.6. Функция sctp_freepaddrs
- 2.1.3. Функция getopt_long()
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- SCTP Characteristics
- SCTP Headers
- SCTP Generic header format
- SCTP Common and generic headers
- SCTP ABORT chunk
- SCTP COOKIE ACK chunk