10.7. Управление завершением соединения

10.7. Управление завершением соединения

В наших примерах на клиента была возложена ответственность по завершению ассоциации, для чего ему приходилось закрывать сокет. Но закрытие сокета не всегда является желаемой операцией с точки зрения приложения. Кроме того, серверу не нужно оставлять ассоциацию открытой после отправки эхо-ответа. В описанных ситуациях применяются альтернативные механизмы завершения ассоциации. Для сокетов типа «один-ко-многим» доступно два метода: корректное и аварийное закрытие.

Если сервер хочет закрыть ассоциацию после отправки сообщения, он должен добавить флаг MSG_EOF в это сообщение, поместив его в поле sinfo_flags структуры sctp_sndrcvinfo. Этот флаг закрывает ассоциацию после подтверждения приема отсылаемого сообщения. Альтернативный метод состоит в установке флага MSG_ABORT в том же поле sinfo_flags. При этом происходит немедленное закрытие ассоциации с отправкой порции ABORT (аналог TCP-сегмента RST). Данные, находящиеся в буфере отправки, сбрасываются. Однако закрытие сеанса SCTP порцией ABORT не приводит к негативным последствиям типа пропущенного состояния TIME_WAIT, как это происходит в TCP. В листинге 10.7 показана новая версия эхо-сервера, инициирующая корректное завершение соединения одновременно с отправкой эхо-ответа клиенту. В листинге 10.8 показана версия клиента, отправляющая порцию ABORT перед закрытием сокета.

Листинг 10.7. Сервер, закрывающий ассоциацию после отправки ответа

//sctp/sctpserv03.c

25 for (;;) {

26  len = sizeof(struct sockaddr_in);

27  rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),

28   (SA*)&cliaddr, &len, &sri, &msg_flags);

29  if (stream_increment) {

30   sri.sinfo_stream++;

31   if (sri.sinfo_stream >=

32    sctp_get_no_strms(sock_fd, (SA*)&cliaddr, len))

33    sri.sinfo_stream = 0;

34  }

35  Sctp_sendmsg(sock_fd, readbuf, rd_sz,

36   (SA*)&cliaddr, len,

37   sri.sinfo_ppid,

38   (sri.sinfo_flags | MSG_EOF), sri.sinfo_stream, 0, 0);

39 }

Отправка ответа с закрытием ассоциации

38 Изменение кода сервера состоит в том, что мы добавляем флаг MSG_EOF к прочим флагам в вызове sctp_sendmsg операцией логического ИЛИ. Благодаря этому сервер закрывает ассоциацию после подтверждения доставки сообщения.

Листинг 10.8. Клиент, выполняющий аварийное закрытие ассоциации

//sctp/sctpclient02.c

25 if (echo_to_all == 0)

26  sctpstr_cli(stdin, sock_fd, (SA*)&servaddr, sizeof(servaddr));

27 else

28  sctpstr_cli_echoall(stdin, sock_fd, (SA*)&servaddr,

29   sizeof(servaddr));

30 strcpy(byemsg, "goodbye");

31 Sctp_sendmsg(sock_fd, byemsg, strlen(byemsg),

32  (SA*)&servaddr, sizeof(servaddr), 0, MSG_ABORT, 0, 0, 0);

33 Close(sock_fd);

Аварийное закрытие ассоциации

30-32 Клиент подготавливает сообщение об аварийном закрытии ассоциации, вызванном пользовательской ошибкой. Затем функция sctp_sendmsg вызывается с флагом MSG_ABORT. При этом отправляется порция данных ABORT, что приводит к немедленному закрытию ассоциации. В порцию данных включается код пользовательской ошибки и сообщение («goodbye») в поле причины ошибки вышележащего уровня.

Закрытие дескриптора сокета

33 Хотя ассоциация и была завершена, дескриптор сокета все равно закрыть нужно, чтобы освободить связанные с ним системные ресурсы.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

4.4. TCP соединения

Из книги Iptables Tutorial 1.1.19 автора Andreasson Oskar

4.4. TCP соединения В этом и в последующих разделах мы поближе рассмотрим признаки состояний и порядок их обработки каждым из трех базовых протоколов TCP, UDP и ICMP, а так же коснемся случая, когда протокол соединения не может быть классифицирован на принадлежность к трем,


4.5. UDP соединения

Из книги Тонкости реестра Windows Vista. Трюки и эффекты автора Клименко Роман Александрович

4.5. UDP соединения По сути своей, UDP соединения не имеют признака состояния. Этому имеется несколько причин, основная из них состоит в том, что этот протокол не предусматривает установления и закрытия соединения, но самый большой недостаток – отсутствие информации об


Механизм слежения за завершением работы компьютера

Из книги AutoCAD 2009 автора Орлов Андрей Александрович

Механизм слежения за завершением работы компьютера Существует возможность активации механизма слежения за завершением работы компьютера (рис. 3.1). По умолчанию он активируется только на серверных версиях Windows. Рис. 3.1. Окно слежения за завершением работы


Поверхности соединения

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

Поверхности соединения Поверхности, создаваемые с помощью команды RULESURF, связывают между собой два примитива, в качестве которых могут выступать отрезки, полилинии, сплайны, окружности, точки, эллипсы и эллиптические дуги. Например, если такими объектами будут две


7.4. Настройка DSL-соединения

Из книги Популярный самоучитель работы в Интернете автора Кондратьев Геннадий Геннадьевич

7.4. Настройка DSL-соединения Для начала хотелось бы дать небольшое вступление. Многие телекоммуникационные компании разных стран мира начали внедрять различные варианты цифровых абонентских линий (DSL — Digital Subscriber Line). Наиболее распространенной из них является технология


Создание соединения

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Создание соединения


Настройка соединения

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Настройка соединения В принципе, все готово к подключению, осталось уточнить два момента.– Первый – нужно проверить тип набора номера. Дело в том, что большинство «наших» телефонов набирают номер в импульсном режиме – это когда в трубке слышен характерный треск, а


10.6 Закрытие соединения

Из книги Первые шаги с Windows 7. Руководство для начинающих автора Колисниченко Денис Н.

10.6 Закрытие соединения Нормальное завершение соединения выполняется с помощью той же процедуры тройного рукопожатия, что и при открытии соединения. Каждая из сторон может начать закрытие соединения по следующему сценарию:A: "Я закончил работу. Данных для пересылки


17.4.2. Ожидание соединения

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

17.4.2. Ожидание соединения Как объяснялось выше, ожидание установки соединения на сокете домена Unix придерживается следующей процедуры: создание сокета, привязка адреса к сокету, перевод системы в режим ожидания соединений и принятие соединения.Ниже показан пример


7.3. Диагностика соединения

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

7.3. Диагностика соединения Для диагностики соединения в Windows используются следующие инструменты: ipconfig, ping и tracert. Но прежде чем их использовать, поговорим о пяти наиболее распространенных ошибках.Начнем с самой распространенной — неправильное имя или пароль пользователя


Соединения

Из книги автора

Соединения Для соединений оптимизатор выполняет процесс слияния потоков данных на основании соответствия значений, явно или неявно указанных в критерии ON. Если какой- нибудь индекс доступен для столбца или столбцов на одной стороне соединения, оптимизатор создает свой


Соединения

Из книги автора

Соединения Соединение является одним из наиболее мощных средств реляционной базы данных по причине его способности поиска абстрактных нормализованных данных в хранилище и в контексте передачи приложениям ненормализованных наборов данных. В операторах JOIN две или


Соединения

Из книги автора

Соединения Соединение используется в операторах SELECT для генерации ненормализованных наборов, содержащих столбцы из нескольких таблиц, которые хранят связанные данные. Множества столбцов, выбранных из каждой таблицы, называются потоками. Процесс соединения объединяет


5.11. Прерывание соединения перед завершением функции accept

Из книги автора

5.11. Прерывание соединения перед завершением функции accept Существует другое условие, аналогичное прерванному системному вызову, пример которого был описан в предыдущем разделе. Оно может привести к возвращению функцией accept нефатальной ошибки, в случае чего следует