5.7. Нормальное завершение

5.7. Нормальное завершение

На этом этапе соединение установлено, и все, что бы мы ни вводили на стороне клиента, отражается обратно.

linux % tcpcli01 127.0.0.1 эту строку мы показывали раньше

hello, world наш ввод

hello, world отраженная сервером строка

good bye

good bye

^D Ctrl+D - наш завершающий символ для обозначения конца файла

Мы вводим две строки, каждая из них отражается, затем мы вводим символ конца файла (EOF) Ctrl+D, который завершает работу клиента. Если мы сразу же выполним команду netstat, то увидим следующее:

linux % netstat -а | grep 9877

tcp 0 0 *:9877           *:*

tcp 0 0 local host:42758 localhost:9877

Клиентская часть соединения (локальный порт 42 758) входит в состояние TIME_WAIT (см. раздел 2.6), и прослушивающий сервер все еще ждет подключения другого клиента. (В этот раз мы передаем вывод netstat программе grep, чтобы вывести только строки с заранее известным портом нашего сервера. Но при этом также удаляется строка заголовка.)

Перечислим этапы нормального завершения работы нашего клиента и сервера.

1. Когда мы набираем символ EOF, функция fgets возвращает пустой указатель, и функция str_cli возвращает управление (см. листинг 5.4).

2. Когда функция str_cli возвращает управление клиентской функции main (см. листинг 5.3), последняя завершает работу, вызывая функцию exit.

3. При завершении процесса выполняется закрытие всех открытых дескрипторов, так что клиентский сокет закрывается ядром. При этом серверу посылается сегмент FIN, на который TCP сервера отвечает сегментом ACK. Это первая половина последовательности завершения работы соединения TCP. На этом этапе сокет сервера находится в состоянии CLOSE_WAIT, а клиентский сокет — в состоянии FIN_WAIT_2 (см. рис. 2.4 и 2.5).

4. Когда TCP сервера получает сегмент FIN, дочерний процесс сервера находится в состоянии ожидания в вызове функции read (см. листинг 5.2), а затем функция read возвращает нуль. Это заставляет функцию str_echo вернуть управление функции main дочернего процесса сервера.

5. Дочерний процесс сервера завершается с помощью вызова функции exit (см. листинг 5.1).

6. Все открытые дескрипторы в дочернем процессе сервера закрываются. Закрытие присоединенного сокета дочерним процессом вызывает отправку двух последних сегментов завершения соединения TCP: FIN от сервера клиенту и ACK от клиента (см. рис. 2.5). На этом этапе соединение полностью завершается. Клиентский сокет входит в состояние TIME_WAIT.

7. Другая часть завершения процесса относится к сигналу SIGCHLD. Он отправляется родительскому процессу, когда завершается дочерний процесс. Это происходит и в нашем примере, но мы не перехватываем данный сигнал в коде, и по умолчанию он игнорируется. Дочерний процесс входит в состояние зомби (zombie). Мы можем проверить это с помощью команды ps.

linux % ps -t pts/6 -o pid,ppid,tty,stat,args,wchan

PID   PPID  TT    STAT COMMAND     WCHAN

22038 22036 pts/6 S    -bash       read_chan

17870 22038 pts/6 S    ./tcpserv01 wait_for_connect

19315 17870 pts/6 Z    [tcpserv01  <defu do_exit

Теперь дочерний процесс находится в состоянии Z (зомби).

Процессы-зомби нужно своевременно удалять, а это требует работы с сигналами Unix. Поэтому в следующем разделе мы сделаем обзор управления сигналами, а затем продолжим рассмотрение нашего примера.

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

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

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

Завершение

Из книги Давайте создадим компилятор! автора Креншоу Джек

Завершение Наконец-то, в этой главе мы узнали как работать с переменными (и литералами) различных типов. Как вы можете видеть, это не было слишком сложно. Фактически, в каком-то отношении большая часть кода выглядит даже еще проще, чем это было в более ранних программах.


Нормальное добавление

Из книги Разгони свой сайт автора Мациевский Николай

Нормальное добавление Если мы собираемся добавить все эти узлы в документ, мы, скорее всего, будем делать это следующим традиционным способом: пройдемся по всем узлам и отклонируем их в индивидуальном порядке (таким образом, мы сможем продолжить их добавление по всему


7.1.5 Завершение

Из книги Процессы жизненного цикла программных средств автора Автор неизвестен


1.1.3.9. Завершение установки

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

1.1.3.9. Завершение установки После установки пакетов будет установлен загрузчик. Фактически система уже установлена, и вы увидите сообщение об этом.Извлеките дистрибутивный диск из привода и щелкните на кнопке Перезагрузка, Рис. 1.21. Все готово к установке Fedora Рис. 1.22.


Завершение работы

Из книги Реестр Windows автора Климов Александр

Завершение работы Выключить компьютер можно двумя способами - Используя команду Выключение меню кнопки Пуск- Открывая окно Диспетчер задач Windows нажатием кнопок Ctrl+Alt+Del и выбирая пункт меню Завершение работы | Выключение Windows позволяет запретить выключение этими


2.5. Завершение сеанса

Из книги Windows Vista без напряга автора Жвалевский Андрей Валентинович

2.5. Завершение сеанса Наверное, для первого раза – более чем достаточно. Компьютер пора выключать.Для этого в меню Пуск предусмотрено две кнопки: Питание и Блокировка.Первая — – не выключает компьютер, а переводит его в специальный «ждущий» режим. Попросту говоря,


Завершение работы

Из книги Реестр Windows автора Климов А

Завершение работы Выключить компьютер можно двумя способами• Используя команду Завершение работы меню кнопки Пуск• Открывая окно Завершение работы программы нажатием кнопок ctrl+alt+del и нажимая кнопку Завершить работуWindows позволяет запретить выключение этими способами


10.6.1 Внезапное завершение

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

10.6.1 Внезапное завершение Каждая из сторон может запросить внезапное завершение (abrupt close) соединения. Это допустимо, когда приложение желает завершить соединение или когда TCP обнаруживает серьезную коммуникационную проблему, которую не может разрешить собственными


10.11 Завершение сеанса

Из книги Инфраструктуры открытых ключей автора Полянская Ольга Юрьевна

10.11 Завершение сеанса 10.11.1 Тайм-аут Работа партнера по соединению может завершиться крахом либо полностью прерваться вследствие неисправности шлюза или связи. Чтобы предотвратить повторную пересылку данных в TCP, существует несколько механизмов.Достигнув первого


Завершение

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

Завершение Если все списки САС проанализированы, а переменная состояния маски причины не показывает, что все причины аннулирования проверены, то переменная состояния статуса сертификата принимает значение "не определен". Большинство приложений будет реагировать на


Завершение транзакций

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Завершение транзакций Транзакция завершается, когда клиентское приложение подтверждает ее или отменяет. Если оператор COMMIT или вызов эквивалентной функции API isc_commit_ transaction не будут успешными, то транзакция не будет подтверждена. Если транзакция, которая не может быть


Завершение цикла while

Из книги Linux глазами хакера автора Флёнов Михаил Евгеньевич

Завершение цикла while      Мы подошли к самому существенному моменту рассмотрения циклов while. При построении цикла while вы должны включить в него какие-то конструкции, изменяющие величину проверяемого выражения так, чтобы в конце концов оно стало ложным. В противном случае


2.5. Завершение установки

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

2.5. Завершение установки После завершения копирования файлов на диск нужно разобраться еще с несколькими настройками. Во-первых, система должна знать, как вы ее будете загружать. Если Windows без разговоров прописывает загрузку в MBR (Master Boot Record, основная загрузочная запись),


3.4. Завершение процесса

Из книги Как тестируют в Google автора Уиттакер Джеймс

3.4. Завершение процесса Обычно процесс завершается одним из двух способов: либо выполняющаяся программа вызывает функцию exit(), либо функция main() заканчивается. У каждого процесса есть код завершения — число, возвращаемое родительскому процессу. Этот код передается в


В завершение

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

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