6.6. Функция shutdown

6.6. Функция shutdown

Обычный способ завершить сетевое соединение — вызвать функцию close. Но у функции close есть два ограничения, которых лишена функция shutdown:

1. Функция close последовательно уменьшает счетчик ссылок дескриптора и закрывает сокет, только если счетчик доходит до нуля. Мы рассматривали это в разделе 4.8. Используя функцию shutdown, мы можем инициировать обычную последовательность завершения соединения TCP (четыре сегмента, начинающихся с FIN, на рис. 2.5) независимо от значения счетчика ссылок.

2. Функция close завершает оба направления передачи данных — и чтение, и запись. Поскольку соединение TCP является двусторонним, возможны ситуации, когда нам понадобится сообщить другому концу соединения, что мы закончили отправку, даже если на том конце соединения имеются данные для отправки нам. Это случай, рассмотренный в предыдущем разделе при описании работы нашей функции str_cli в пакетном режиме. На рис. 6.10 показаны типичные вызовы функций в этом сценарии.

Рис. 6.10. Вызов функции shutdown для закрытия половины соединения TCP

#include <sys/socket.h>

int shutdown(int sockfd, int howto);

Возвращает: 0 в случае успешного выполнения, -1 в случае ошибки

Действие функции зависит от значения аргумента howto.

SHUT_RD. Закрывается считывающая половина соединения: из сокета больше нельзя считывать данные, и все данные, находящиеся в данный момент в буфере приема сокета, сбрасываются. Процесс больше не может выполнять функции чтения из сокета. Любые данные для сокета TCP, полученные после вызова функции shutdown с этим аргументом, подтверждаются и «молча» игнорируются.

ПРИМЕЧАНИЕ

По умолчанию все, что записывается в маршрутизирующий сокет (см. главу 17), возвращается как возможный ввод на все маршрутизирующие сокеты узла. Некоторые программы вызывают функцию shutdown со вторым аргументом SHUT_RD, чтобы предотвратить получение подобной копии. Другой способ избежать копирования — отключить параметр сокета SO_USELOOPBACK.

? SHUT_WR. Закрывается записывающая половина соединения. В случае TCP это называется половинным закрытием (см. раздел 18.5 [111]). Все данные, находящиеся в данный момент в буфере отправки сокета, будут отправлены, а затем будет выполнена обычная последовательность действий по завершению соединения TCP. Как мы отмечали ранее, закрытие записывающей половины соединения выполняется независимо от того, является ли значение в счетчике ссылок дескриптора сокета положительным или нет. Процесс теряет возможность записывать данные в сокет.

SHUT_RDWR. Закрываются и читающая, и записывающая половины соединения. Это эквивалентно двум вызовам функции shutdown: сначала с аргументом SHUT_RD, затем — с аргументом SHUT_WR.

В табл. 7.4 приведены все возможные сценарии, доступные процессу при вызове функций shutdown и close. Действие функции close зависит от значения параметра сокета SO_LINGER.

ПРИМЕЧАНИЕ

Три константы SHUT_xxx определяются в спецификации POSIX. Типичные значения аргумента howto, с которыми вы встретитесь, — это 0 (закрытие читающей половины), 1 (закрытие записывающей половины) и 2 (закрытие обеих половин).

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

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

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

WindowsStartup and Shutdown

Из книги Справочник по реестру Windows XP автора Коллектив РуБоард


shutdown.exe

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

shutdown.exe Местонахождение: Windowssystem32 Описание: Windows Remote Shutdown Tool Утилита Shutdown позволяет выключать или перегружать локальный или удаленный ПК, используя командную строку или специально созданный ярлык. Простой ее вызов без каких-либо параметров обеспечивает завершение сеанса


Функция SUM

Из книги Fiction Book Designer Краткое руководство автора Автор неизвестен

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


Функция uni()

Из книги Fiction Book Designer 3.2. Краткое руководство автора Izekbis

Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book


Функция uni()

Из книги Технология XSLT автора Валиков Алексей Николаевич

Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book


Функция not

Из книги PGP: Кодирование и шифрование информации с открытым ключом. автора Левин Максим


Функция contains

Из книги Fiction Book Designer 3.2. Руководство по созданию книг автора


Функция id

Из книги Ubuntu 10. Краткое руководство пользователя автора Колисниченко Д. Н.


Функция key

Из книги Введение в криптографию автора Циммерманн Филипп


Хэш-функция.

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Хэш-функция. Еще одно важное преимущество использования PGP состоит в том, что PGP применяет так называемую «хэш-функцию», которая действует таким образом, что в том случае какого-либо изменения информации, пусть даже на один бит, результат «хэш-функции» будет совершенно


Функция uni()

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

Функция uni() Поиск/замена символа по его юникодному номеру также может быть сделана при помощи функции uni().Пример функции uni(): Boouni(107,32)Designer найдет слово Book


21.2. Команды poweroff, halt, reboot, shutdown

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

21.2. Команды poweroff, halt, reboot, shutdown С помощью меню GNOME можно легко завершить работу системы. Спрашивается, зачем нужно знать дополнительные команды для завершения работы системы? Хотя бы для того, чтобы настроить вашу систему на автоматическое выключение. Скажем, в 23:00. С


Хэш-функция

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

Хэш-функция Однако описанная выше схема имеет ряд существенных недостатков. Она крайне медлительна и производит слишком большой объём данных — по меньшей мере вдвое больше объёма исходной информации. Улучшением такой схемы становится введение в процесс преобразования


shutdown

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

shutdown Формат:shutdownВыполнение этой команды приводит к завершению работы системы. Многие поставщики программного обеспечения поддерживают свои специфические версии этой команды. Команда$ shutdown nowвызовет немедленное завершение работы системы, а команда$ shutdown -g60 -16 -уприведет


9.13. Функция shutdown

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

9.13. Функция shutdown Обсуждавшаяся в разделе 9.6 функция shutdown может использоваться с конечной точкой SCTP, использующей интерфейс типа «один-к-одному». Поскольку архитектура SCTP не предусматривает наполовину закрытого состояния, реакция на вызов shutdown конечной точки SCTP