5.6. Нормальный запуск

5.6. Нормальный запуск

Наш небольшой пример использования TCP (около 150 строк кода для двух функций main, str_echo, str_cli, readline и writen) позволяет понять, как запускаются и завершаются клиент и сервер и, что наиболее важно, как развиваются события, если произошел сбой на узле клиента или в клиентском процессе, потеряна связь в сети и т.д. Только при понимании этих «граничных условий» и их взаимодействия с протоколами TCP/IP мы сможем обеспечить устойчивость клиентов и серверов, которые смогут справляться с подобными ситуациями.

Сначала мы запускаем сервер в фоновом режиме на узле linux.

linux % tcpserv01 &

[1] 17870

Когда сервер запускается, он вызывает функции socket, bind, listen и accept, а затем блокируется в вызове функции accept. (Мы еще не запустили клиент.) Перед тем, как запустить клиент, мы запускаем программу netstat, чтобы проверить состояние прослушиваемого сокета сервера.

linux % netstat -a

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp        0      0 *:9877        *:*             LISTEN

Здесь мы показываем только первую строку вывода и интересующую нас строку. Эта команда показывает состояние всех сокетов в системе, поэтому вывод может быть большим. Для просмотра прослушиваемых сокетов следует указать параметр -a.

Результат совпадает с нашими ожиданиями. Сокет находится в состоянии LISTEN, локальный IP-адрес задан с помощью символа подстановки (то есть является универсальным) и указан локальный порт 9877. Функция netstat выводит звездочку для нулевого IP-адреса (INADDR_ANY, универсальный адрес) или для нулевого порта.

Затем на том же узле мы запускаем клиент, задав IP-адрес сервера 127.0.0.1. Мы могли бы задать здесь и нормальный адрес сервера (его IP-адрес в сети).

linux % tcpcli01 127.0.0.1

Клиент вызывает функции socket и connect, последняя осуществляет трехэтапное рукопожатие TCP. Когда рукопожатие TCP завершается, функция connect возвращает управление процессу-клиенту, а функция accept — процессу-серверу. Соединение установлено. Затем выполняются следующие шаги:

1. Клиент вызывает функцию str_cli, которая блокируется в вызове функции fgets, поскольку мы еще ничего не ввели.

2. Когда функция accept возвращает управление процессу-серверу, последний вызывает функцию fork, а дочерний процесс вызывает функцию str_echo. Та вызывает функцию read, блокируемую в ожидании получения данных от клиента.

3. Родительский процесс сервера снова вызывает функцию accept и блокируется в ожидании подключения следующего клиента.

У нас имеется три процесса, и все они находятся в состоянии ожидания (блокированы): клиент, родительский процесс сервера и дочерний процесс сервера.

ПРИМЕЧАНИЕ

Мы специально поставили первым пунктом (после завершения трехэтапного рукопожатия) вызов функции str_cli, происходящий на стороне клиента, а затем уже перечислили действия на стороне сервера. Причину объясняет рис. 2.5: функция connect возвращает управление, когда клиент получает второй сегмент рукопожатия. Однако функция accept не возвращает управление до тех пор, пока сервер не получит третий сегмент рукопожатия, то есть пока не пройдет половина периода RTT после завершения функции connect.

Мы намеренно запускаем и клиент, и сервер на одном узле — так проще всего экспериментировать с клиент-серверными приложениями. Поскольку клиент и сервер запущены на одном узле, функция netstat отображает теперь две дополнительные строки вывода, соответствующие соединению TCP:

linux % netstat -a

Proto Recv-Q Send-Q Local Address   Foreign Address State

tcp        0      0 localhost:9877  localhost:42758 ESTABLISHED

tcp        0      0 localhost:42758 localhost:42758 ESTABLISHED

tcp        0      0 *:9877          *:*             LISTEN

Первая из строк состояния ESTABLISHED соответствует дочернему сокету сервера, поскольку локальным портом является порт 9877. Вторая строка ESTABLISHED — это клиентский сокет, поскольку локальный порт — порт 42 758. Если мы запускаем клиент и сервер на разных узлах, на узле клиента будет отображаться только клиентский сокет, а на узле сервера — два серверных сокета.

Для проверки состояний процессов и отношений между ними можно также использовать команду 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       wait4

17870 22038 pts/6 S   ./tcpserv01 wait_for_connect

19315 17870 pts/6 S   ./tcpserv01 tcp_data_wait

19314 22038 pts/6 S   ./tcpcli01  127.0.0.1 read_chan

Мы вызвали ps с несколько необычным набором аргументов для того, чтобы получить всю необходимую для дальнейшего обсуждения информацию. Мы запустили клиент и сервер из одного окна (pts/6, что означает псевдотерминал 6). В колонках PID и PPID показаны отношения между родительским и дочерним процессами. Можно точно сказать, что первая строка tcpserv01 соответствует родительскому процессу, а вторая строка tcpserv01 — дочернему, поскольку PPID дочернего процесса — это PID родительского. Кроме того, PPID родительского процесса совпадает с PID интерпретатора команд (bash).

Колонка STAT для всех трех сетевых процессов отмечена символом S. Это означает, что процессы находятся в состоянии ожидания (sleeping). Если процесс находится в состоянии ожидания, колонка WCHAN сообщит нам о том, чем он занят. В Linux значение wait_for_connect выводится, если процесс блокируется функцией accept или connect, значение tcp_data_wait — если процесс блокируется при вводе или выводе через сокет, a read_chan — если процесс блокируется при терминальном вводе-выводе. Так что для наших трех сетевых процессов значения WCHAN выглядят вполне осмысленно.

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

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

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

Установка и запуск

Из книги Эффективное делопроизводство автора Пташинский Владимир Сергеевич

Установка и запуск Для установки программы Lingvo 12 нужно вставить диск и следовать инструкциям. Если не сработал автозапуск, разработчики рекомендуют устанавливать через панель управления Windows, дважды щелкнув на значке Установка и удаление программ.Для запуска Lingvo 12 из


Запуск программ

Из книги Windows Vista автора Вавилов Сергей

Запуск программ Существует несколько способов запуска приложений. Все они, за исключением одного, использовались и в предыдущих версиях Windows. Новый вариант – запуск программ с использованием строки поиска меню Пуск. Зная название программы, достаточно набрать в строке


Заблуждение № 3: коэффициент конверсии 1,8 % – нормальный для среднего интернет-магазина

Из книги Добавьте в корзину. Ключевые принципы повышения конверсии веб-сайтов автора Айзенберг Джеффри

Заблуждение № 3: коэффициент конверсии 1,8 % – нормальный для среднего интернет-магазина Неправда! Довод, конечно, убедительный, но такая статистика сводит нас с ума! Среди наших клиентов – владельцы сайтов с коэффициентом конверсии от 0,35 до 77,28 %. Ведь столько факторов


Запуск KDC

Из книги Сетевые средства Linux автора Смит Родерик В.

Запуск KDC К этому моменту компоненты Kerberos настроены и могут быть запущены. Для запуска сервером можно использовать способы, описанные в главе 4. Если пакет Kerberos поставлялся вместе с вашей системой, для вероятно, существует сценарий запуска SysV. Сценарий для KDC обычно


Запуск rlogind

Из книги VBA для чайников автора Каммингс Стив

Запуск rlogind Сервер rlogind обычно запускается посредством суперсервера. Во многих дистрибутивных пакетах в конфигурационном файле /etc/inetd.conf уже присутствует запись для rlogind, но чаще всего она закомментирована. Для того, чтобы сервер выполнялся на компьютере, вам надо убрать


Запуск сервера VNC

Из книги Как найти и скачать в Интернете любые файлы автора Райтман М. А.


Запуск SWAT

Из книги Linux программирование в примерах автора Роббинс Арнольд

Запуск SWAT Функции сервера SWAT реализованы в программе swat. Для ее запуска может быть использован любой из способов, описанных в главе 4, но чаще всего swat запускается посредством суперсервера. Соответствующая запись в файле /etc/inetd.conf имеет следующий вид:swat stream tcp nowait.400 root


Запуск Procmail

Из книги Флибуста. Обратная сторона [Инструкции по установке и запуску i2p, TOR и VPN для «чайников». v. 1.1] автора Коллектив авторов


Запуск форм

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

Запуск форм В процессе разработки формы ее можно запустить (т.е. активизировать выполнение и отобразить на экране) в любое время. Для этого выполните следующее.1. Выберите окно формы.Щелкните в окне формы или в окне программного кода, ассоциированного с формой.2. Отобразите


Первый запуск

Из книги Как приручить компьютер за несколько часов автора Ремнева Ирина

Первый запуск Как и большинство современных антивирусных программ, AVG Anti-Virus Free является не единой программой, а пакетом, состоящим из нескольких модулей, отвечающих за различные области защиты компьютера:? Anti-Virus — антивирусный сканер, отвечает за сканирование файлов


2. Запуск

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

2. Запуск 2.1.После завершения распаковки архива, в выбранной папке (в моем случае TOR) связка распакуется в директорию C: PRIVATПРОГРАММЫTORTor Browser Рис. 11 Рис. 11Переходим в нее (1)Можно сразу запустить исполняемый файл Start Tor Browser.exe (2), но лучше создать ярлычок для


4. Запуск i2P

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

4. Запуск i2P Запускаем ярлык-«человечка» Start i2p (no window) (1)над треем появится серый прямоугольник (2) Рис. 78В адресной строке браузера набираем http://127.0.0.1:7657/console Рис. 79Когда вы запустите i2p у вас некоторое время не будет локальных туннелей Рис. 80Затем появится надпись «Не


Запуск программы

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

Запуск программы Мы запустили эхо-сервер SCTP без аргументов командной строки на компьютере, работающем под управлением FreeBSD. Клиенту при запуске необходимо указать IP-адрес сервера.freebsd4% sctpclient01 10.1.1.5[0]Hello                                     Отправка сообщения по потоку


Запуск программы

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

Запуск программы Мы запустили клиент и сервер на разных компьютерах с FreeBSD, между которыми был установлен настраиваемый маршрутизатор (рис. 10.4). Маршрутизатор может создавать задержку и сбрасывать часть пакетов. Сначала мы запускаем программу без сброса пакетов на


Запуск

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

Запуск Нет ничего проще, чем запустить программу Internet Explorer. Вы можете запустить ее одним из способов:1) двойной щелчок по значку который находится на рабочем столе;2) щелкнуть по значку размещенном на панели быстрого запуска 3) нажать кнопку Пуск и выбрать строчку Internet