Книга: UNIX: разработка сетевых приложений
23.9. Проверка соединения и ошибки доступа
Разделы на этой странице:
23.9. Проверка соединения и ошибки доступа
Механизм периодической проверки соединения, предоставляемый протоколом SCTP, основан на той же концепции, что и параметр поддержания соединения TCP keep-alive. Однако в SCTP этот механизм по умолчанию включен, тогда как в TCP он выключен. Приложение может устанавливать пороговое значение количества неудачных проверок при помощи того же параметра сокета, который использовался в разделе 23.8. Порог ошибок — это количество пропущенных проверочных пакетов и тайм-аутов повторной передачи, после которого адрес получателя считается недоступным. Когда доступность адреса восстанавливается (о чем сообщают все те же проверочные пакеты), он снова становится активным.
Приложение может отключить проверку соединения, но без нее SCTP не сможет узнать о доступности адреса собеседника, который ранее был признан недоступным. Без вмешательства пользователя такой адрес не сможет стать активным.
Параметр проверки соединения задается полем spp_hbinterval
структуры sctp_paddrparams
. Если приложение устанавливает это поле равным SCTP_NO_HB
(эта константа имеет значение 0), проверка соединения отключается. Ненулевое значение устанавливает задержку проверки соединения в миллисекундах. К фиксированной задержке прибавляется текущее значение таймера повторной передачи и некоторое случайное число, в результате чего получается реальный промежуток времени между проверками соединения. В листинге 23.14 приводится небольшая функция, которая позволяет устанавливать задержку проверки соединения, или вовсе отключать этот механизм протокола SCTP для конкретного адресата. Обратите внимание, что если поле spp_pathmaxrxr
структуры sctp_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 }
Обнуление структуры sctp_paddrparams и копирование аргумента
8-9
Мы обнуляем структуру sctp_paddrparams
, чтобы случайно не изменить какой-нибудь параметр, который нас не интересует. Затем мы копируем в нее переданное пользователем значение задержки: SCTP_ISSUE_HB
, SCTP_NO_HB
или конкретное число.
Установка адреса
10
Функция подготавливает адрес и копирует его в структуру sctp_paddrparams
, чтобы реализация SCTP знала, к какому адресу относятся устанавливаемые нами параметры периодической проверки соединения.
Выполнение действия
11-12
Наконец, функция делает вызов параметра сокета, чтобы выполнить запрошенную пользователем операцию.
- 23.1. Введение
- 23.2. Сервер типа «один-ко-многим» с автоматическим закрытием
- 23.3. Частичная доставка
- 23.4. Уведомления
- 23.5. Неупорядоченные данные
- 23.6. Связывание с подмножеством адресов
- 23.7. Получение адресов
- 23.8. Определение идентификатора ассоциации по IP-адресу
- 23.9. Проверка соединения и ошибки доступа
- 23.10. Выделение ассоциации
- 23.11. Управление таймерами
- 23.12. Когда SCTP оказывается предпочтительнее TCP
- 23.13. Резюме
- Упражнения
- 3.2.4. Ошибки при задавании вопросов
- Ошибки проектирования базы данных
- Глава 11. Соединения точка-точка и ретрансляторы
- 6.2. Типичные ошибки при проведении программ продвижения и варианты их устранения
- 9.4. Права доступа к squid
- 10.5. Транзакции и пути доступа меню
- 5. Null-значения и проверка условий
- 2. Операции декартового произведения и естественного соединения
- 4. Варианты операций соединения
- 5. Операции внутреннего соединения.
- 6. Операция естественного соединения.
- 7. Операция левого внешнего соединения.