UNIX: разработка сетевых приложений, стр. 265
4 { 5 struct sctp_paddrparams sp; 6 int siz; 7 siz = sizeof(struct sctp_paddrparams); 8 bzero(&sp, siz); 9 memcpy(&sp, spp_address, sa.salen);10 sctp_opt_info(sock_fd, 0, SCTP_PEER_ADDR_PARAMS, &sp, &siz);11 return(sp.spp_assoc_id);12 }7-8sctp_paddrparams9sctp_paddrparams10SCTP_PEER_ADDR_PARAMSsctp_opt_infogetsockoptSCTP_PEER_ADDR_PARAMS11sctp_opt_info23.9. Проверка соединения и ошибки доступа
Механизм периодической проверки соединения, предоставляемый протоколом SCTP, основан на той же концепции, что и параметр поддержания соединения TCP keep-alive. Однако в SCTP этот механизм по умолчанию включен, тогда как в TCP он выключен. Приложение может устанавливать пороговое значение количества неудачных проверок при помощи того же параметра сокета, который использовался в разделе 23.8. Порог ошибок — это количество пропущенных проверочных пакетов и тайм-аутов повторной передачи, после которого адрес получателя считается недоступным. Когда доступность адреса восстанавливается (о чем сообщают все те же проверочные пакеты), он снова становится активным.
Приложение может отключить проверку соединения, но без нее SCTP не сможет узнать о доступности адреса собеседника, который ранее был признан недоступным. Без вмешательства пользователя такой адрес не сможет стать активным.
Параметр проверки соединения задается полем
spp_hbintervalsctp_paddrparamsSCTP_NO_HBspp_pathmaxrxrsctp_paddrparamsЛистинг 23.14. Управление периодической проверкой соединения
//sctp/sctp_modify_hb.c 1 #include "unp.h" 2 int 3 heartbeat_action(int sock_fd, struct sockaddr *sa, socklen_t salen, 4 u_int value) 5 { 6 struct sctp_paddrparams sp; 7 int siz; 8 bzero(&sp, sizeof(sp)); 9 sp.spp_hbinterval = value;10 memcpy((caddr_t)&sp, spp_address, sa.salen);11 Setsockopt(sock_fd, IPPROTO_SCTP,12 SCTP_PEER_ADDR_PARAMS, &sp, sizeof(sp));13 return(0);14 }8-9sctp_paddrparamsSCTP_ISSUE_HBSCTP_NO_HB10sctp_paddrparams11-1223.10. Выделение ассоциации
Пока что мы занимались исключительно интерфейсом типа «один-ко-многим». Этот интерфейс имеет несколько преимуществ перед традиционным интерфейсом «один-к-одному»:
■ программа работает с единственным дескриптором;
■ программисту достаточно написать простой последовательный сервер;
■ приложение может передавать данные в третьем и четвертом пакетах четырехэтажного рукопожатия, если для неявной установки соединения используются функции
sendmsgsctp_sendmsg■ отсутствует необходимость в отслеживании состояния на транспортном уровне. Другими словами, приложение просто запрашивает данные из дескриптора сокета, не вызывая традиционных функций
connectacceptЕсть у этого интерфейса и недостатки. Самый существенный из них состоит в том, что интерфейс типа «один-ко-многим» затрудняет написание параллельного сервера (многопоточного или порождающего процессы). Для устранения этого недостатка была придумана функция
sctp_peeloff