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

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

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

Рис. 5.4. Получение сегмента RST для состояния соединения ESTABLISHED перед вызовом функции accept

Трехэтапное рукопожатие TCP завершается, устанавливается соединение, а затем TCP клиента посылает сегмент RST. На стороне сервера соединение ставится в очередь в ожидании вызова функции accept, и в это время сервер получает сегмент RST. Спустя некоторое время процесс сервера вызывает функцию accept.

К сожалению, принцип обработки прерванного соединения зависит от реализации. Реализации, происходящие от Беркли, обрабатывают прерванное соединение полностью внутри ядра, и сервер никогда не узнает об этом. Большинство реализаций SVR4, однако, возвращают процессу ошибку, и эта ошибка зависит от реализации. При этом переменная errno принимает значение EPROTO (ошибка протокола), хотя в POSIX указано, что должна возвращаться ошибка ECONNABORTED (прерывание соединения). POSIX определяет эту ошибку иначе, так как ошибка EPROTO возвращается еще и в том случае, когда в подсистеме потоков происходят какие-либо фатальные события, имеющие отношение к протоколу. Возвращение той же ошибки для нефатального прерывания установленного соединения клиентом приводит к тому, что сервер не знает, вызывать снова функцию accept или нет. В случае ошибки ECONNABORTED сервер может игнорировать ошибку и снова вызывать функцию accept.

ПРИМЕЧАНИЕ

Этот сценарий очень просто имитировать. Запустите сервер, который должен вызвать функции socket, bind и listen, а затем перед вызовом функции accept переведите сервер на короткое время в состояние ожидания. Пока процесс сервера находится в состоянии ожидания, запустите клиент, который вызовет функции socket и connect. Как только функция connect завершится, установите параметр сокета SO_LINGER, чтобы сгенерировать сегмент RST (который мы описываем в разделе 7.5 и демонстрируем в листинге 16.14), и завершите процессы.

ПРИМЕЧАНИЕ

В [128] описана обработка этой ошибки в Беркли-ядрах (Berkeley-derived kernels), которые никогда не передают ее процессу. Обработка RST с вызовом функции tcp_close представлена в [128, с. 964]. Эта функция вызывает функцию in_pcbdetach [128, с. 897], которая, в свою очередь, вызывает функцию sofree [128, с. 719]. Функция sofree [128, с. 473] обнаруживает, что сокет все еще находится в очереди полностью установленных соединений прослушиваемого сокета. Она удаляет этот сокет из очереди и освобождает сокет. Когда сервер, наконец, вызовет функцию accept, он не сможет узнать, что установленное соединение было удалено из очереди.

Мы вернемся к подобным прерванным соединениям в разделе 16.6 и покажем, какие проблемы они могут порождать совместно с функцией select и прослушиваемым сокетом в нормальном режиме блокирования.

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

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

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

Перед тем как согласиться

Из книги Записки автоматизатора. Профессиональная исповедь автора Орлов Андрей Георгиевич

Перед тем как согласиться Главный автоматизатор (начальник департамента/управления/отдела автоматизации/ информационных технологий, ИТ-менеджер, сейчас вошло в моду новое слово – CIO), как бы он ни назывался, – не грузчик. Поэтому прием его на работу не должен происходить


6.5.1. Действие ACCEPT

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

6.5.1. Действие ACCEPT Данная операция не имеет дополнительных ключей. Если над пакетом выполняется действие ACCEPT, то пакет прекращает движение по цепочке (и всем вызвавшим цепочкам, если текущая цепочка была вложенной) и считается ПРИНЯТЫМ (то бишь пропускается), тем не менее,


6 ПРЕРЫВАНИЕ

Из книги ИНФОРМАЦИОННАЯ ТЕХНОЛОГИЯ. ПРОГРАММНЫЕ КОНСТРУКТИВЫ И УСЛОВНЫЕ ОБОЗНАЧЕНИЯ ДЛЯ ИХ ПРЕДСТАВЛЕНИЯ автора Госстандарт России


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

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

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


Прерывание и перезапуск цикла

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

Прерывание и перезапуск цикла Иногда бывает нужно прервать выполнение цикла. Для этого JavaScript предоставляет Web-программистам операторы break и continue.Оператор прерывания break позволяет прервать выполнение цикла и перейти к следующему за ним выражению:while (a < 100) {a = a * i + 2;if (a


Прерывание и перезапуск цикла

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

Прерывание и перезапуск цикла Иногда бывает нужно прервать выполнение цикла. Для этого JavaScript предоставляет Web-программистам операторы break и continue.Оператор прерывания break позволяет прервать выполнение цикла и перейти к следующему за ним выражению:while (a < 100) {a = a * i + 2;if (a >


Пример 10-21. Прерывание многоуровневых циклов

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

Пример 10-21. Прерывание многоуровневых циклов #!/bin/bash# break-levels.sh: Прерывание циклов.# "break N" прерывает исполнение цикла, стоящего на N уровней выше текущего.for outerloop in 1 2 3 4 5do echo -n "Группа $outerloop: " for innerloop in 1 2 3 4 5 do echo -n "$innerloop " if [ "$innerloop" -eq 3 ] then break # Попробуйте "break 2", #


4.6. Функция accept

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

4.6. Функция accept Функция accept вызывается сервером TCP для возвращения следующего установленного соединения из начала очереди полностью установленных соединений (см. рис. 4.2). Если очередь полностью установленных соединений пуста, процесс переходит в состояние ожидания (по


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

Из книги Разработка ядра Linux автора Лав Роберт

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


16.6. Неблокируемая функция accept

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

16.6. Неблокируемая функция accept Как было сказано в главе 6, функция select сообщает, что прослушиваемый сокет готов для чтения, когда установленное соединение готово к обработке функцией accept. Следовательно, если мы используем функцию select для определения готовности входящих


30.6. Сервер TCP с предварительным порождением процессов без блокировки для вызова accept

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

30.6. Сервер TCP с предварительным порождением процессов без блокировки для вызова accept В первом из рассматриваемых нами «усовершенствованных» серверов используется технология, называемая предварительным созданием процессов (preforking). Вместо того чтобы вызывать функцию fork


30.7. Сервер TCP с предварительным порождением процессов и защитой вызова accept блокировкой файла

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

30.7. Сервер TCP с предварительным порождением процессов и защитой вызова accept блокировкой файла Описанная выше реализация, позволяющая нескольким процессам вызывать функцию accept на одном и том же прослушиваемом дескрипторе, возможна только для систем 4.4BSD, в которых функция


30.8. Сервер TCP с предварительным порождением процессов и защитой вызова accept при помощи взаимного исключения

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

30.8. Сервер TCP с предварительным порождением процессов и защитой вызова accept при помощи взаимного исключения Как мы уже говорили, существует несколько способов синхронизации процессов путем блокирования. Блокировка файла по стандарту POSIX, рассмотренная в предыдущем


30.11. Сервер TCP с предварительным порождением потоков, каждый из которых вызывает accept

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

30.11. Сервер TCP с предварительным порождением потоков, каждый из которых вызывает accept Ранее в этой главе мы обнаружили, что версии, в которых заранее создается пул дочерних процессов, работают быстрее, чем те, в которых для каждого клиентского запроса приходится вызывать


30.12. Сервер с предварительным порождением потоков: основной поток вызывает функцию accept

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

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


Перед тем как начать

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

Перед тем как начать Эта книга посвящена ядру Linux: как оно работает, почему оно работает и чему следует уделить внимание. Далее будут описаны принципы работы и реализация основных подсистем ядра, а также интерфейсы и программная семантика. Эта книга касается практических