Приложение C Программа sock

Для генерации TCP и UDP данных использовалась простая тестовая программа, называемая sock. Она выполняла функции как клиента, так и сервера. С помощью этой тестовой программы, которую можно запустить из приглашения shellа, мы избежали необходимости писать новые программы клиента и сервера на языке программирования C для каждой специальной характеристики, которую хотели протестировать. Так как цель этой книги - понимание сетевых протоколов, а не сетевого программирования, в этом приложении мы ограничимся описанием программы и ее опций.

Существует определенное количество программ, функционально похожих на sock. Juergen Nickelsen написал программу, которая называется socket, а Dave Yost программу sockio. Обе реализуют много похожих функций. Части программы sock также были получены из свободно распространяемой программы ttcp, написанной Mike Muuss и Terry Slattery.

Программа sock может работать в одном из четырех режимов:

1. Интерактивный клиент: по умолчанию. Программа подсоединяется к серверу и затем копирует стандартный ввод на сервер и копирует все, что получено от сервера, на стандартный вывод. Это показано на рисунке С.1.

Рисунок С.1 Функционирование программы sock как интерактивного клиента.

Мы должны указать имя хоста сервера и имя сервиса, к которому необходимо подсоединиться. Хост может быть указан в виде IP адреса, а сервис может быть указан в виде целого номера порта. Подсоединение к стандартному эхо серверу (глава 1, раздел "Стандартные простые сервисы"), от sun к bsdi, отражает эхом все, что введено:

    sun % sock bsdi echo

    a test line                    вводим строку

    a test line                    эхо сервер вернул копию

    ^D                             вводим символ конца файла, чтобы прекратить работу программы

- Интерактивный сервер: указана опция -s. Необходимо указать имя сервиса (или номер порта):

    sun % sock s 5555            работает как сервер, слушает порт 5555

Программа ожидает соединения от клиента и затем копирует стандартный ввод клиенту и копирует все, что получено от клиента, на стандартный вывод. В командной строке перед номером порта может стоять Internet адрес, чтобы указать, с какого локального интерфейса будет принято соединение:

    sun % sock -s 140.252.13.33 5555        принимает соединения только по Ethernet

По умолчанию запрос на соединение принимается с любого локального интерфейса.

- Клиент источник: указана опция -i. По умолчанию, буфер размером 1024 байта записывается в сеть 1024 раза. С помощью опций -n и -w можно изменить эти значения. Например, команда

    sun % sock -i -n12 -w4096 bsdi discard

запишет 12 буферов, каждый из которых по 4096 байт, на discard сервис хоста bsdi.

- Сервер приемник: указаны опции -i и -s. Данные читаются из сети и отбрасываются.

Несмотря на то, что в этих примерах использовался TCP (по умолчанию), с помощью опции -u можно использовать UDP.

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

-b n

  Воспринимает n как номер локального порта клиента. (По умолчанию используется динамический номер порта, назначенный системой клиента.)

-c

  Конвертирует символы новой строки, которые прочитаны из стандартного ввода, в символы возврата каретки и пропуска строки. Когда осуществляется чтение из сети, конвертирует последовательность <возврат каретки, пропуск строки> в единственный символ новой строки. Большинство Internet приложений работают с NVT ASCII (глава 26, раздел "Протокол Telnet"), где возврат каретки и пропуск строки используются для завершения каждой строки.

-f a.b.c.d.p

  Указывает удаленный IP адрес (a.b.c.d) и удаленный номер порта (p) для конечной точки UDP (глава 11, раздел "Сервер UDP").

-h

  Переводит TCP соединение в наполовину закрытое состояние (глава 18, раздел "Наполовину закрытый TCP"). То есть, соединение не разрывается при появлении в стандартном вводе символа конца файла. Вместо этого, соединение наполовину закрывается, при этом чтение из сети продолжается до тех пор, пока сам хост не закроет соединение.

-i

  Клиент источник или сервер приемник. Либо пишет данные в сеть (по умолчанию), либо, если используется с опцией -s, читает данные из сети. Опция -n указывает количество буферов, которые необходимо записать (или считать), опция -w указывает размер каждой записи, а опция -r указывает размер каждого чтения.

-n n

  Когда используется с опцией -i, n указывает количество буферов, которые необходимо считать или записать. По умолчанию n равно 1024.

-p n

  Указывает количество секунд, в течение которых необходимо выдержать паузу, перед каждым чтением или записью. Это может быть использовано в случае клиента источника (-i) или сервера приемника (-is), чтобы вставить задержку между каждым чтением или записью в сеть. Также существует опция -P, которая позволяет вставить паузу перед первым чтением или записью.

-q n

  Указывает размер очереди ожидания соединения для TCP сервера: разрешенное количество соединений, которое TCP может поставить в очередь для приложения (рисунок 18.23). По умолчанию равно 5.

-r n

  Когда используется с опциями -is, n определяет размер каждого чтения из сети. По умолчанию 1024 байта за одно чтение.

-s

  Функционирует как сервер, а не как клиент.

-u

  Использует UDP вместо TCP.

-v

  Отладочный режим. Печатает дополнительные подробности (как, например, динамически назначаемые номера портов клиента и сервера) в стандартный вывод ошибок.

-w n

  Когда используется с опцией -i, определяет размер каждой записи в сеть. По умолчанию 1024 байта за запись.

-A

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

-B

  Включает опцию сокета SO_BROADCAST, что позволяет UDP датаграммам быть отправленным на широковещательный IP адрес.

-D

  Включает опцию сокета SO_DEBUG. При этом выводится дополнительная отладочная информация, которую содержит ядро для этого TCP соединения (приложение A, раздел "Опция отладки сокета"). Эта информация может быть получена позже, с помощью запуска программы trpt(8).

-E

  Включает опцию сокета IP_RECVDSTADDR, если она поддерживается реализацией (глава 11, раздел "Сервер UDP"). Это предназначено для UDP серверов, чтобы печатать IP адреса назначения полученных UDP датаграмм.

-F

  Будет использоваться конкурентный TCP сервер. В этом случае сервер создает новый процесс с использованием программы fork для каждого соединения клиента.

-K

  Включает опцию TCP сокета SO_KEEPALIVE (глава 23).

-L n

  Устанавливает время задержки (опция сокета SO_LINGER) для конечной точки TCP в значение n. Время задержки равное 0 означает, что когда соединение закрывается, любые данные, оставшиеся в очереди для отправки, отбрасываются, а удаленному хосту посылается сброс (глава 18, раздел "Сегменты сброса (Reset)"). Положительное время задержки - это время (в сотых долях секунды), в течение которого соединение не закрывается, пока все данные не будут отправлены и подтверждены. Если, после закрытия сетевого соединения, не все данные были отправлены и подтверждены в момент истечения этого таймера, закрытие вернет ошибочный код возврата.

-N

  Устанавливает опцию сокета TCP_NODELAY, чтобы выключить алгоритм Нагла (глава 19, раздел "Алгоритм Нагла").

-O n

  Сообщает TCP серверу количество секунд, в течение которых тот должен выдержать паузу, перед приемом первого соединения от клиента.

-P n

  Указывает количество секунд, в течение которых необходимо выдержать паузу, перед тем как будет осуществлено первое чтение или запись в сеть. Это может быть использовано с сервером приемником (-is), чтобы осуществить задержку после приема запроса на соединение от клиента, однако перед тем, как осуществить первое чтение из сети. При использовании с клиентом источником или сервером приемником (-i), эта величина определяет промежуток времени между установлением соединения и перед первой записью в сеть. Опция -p определяет паузу между каждыми соседними чтениями или записями.

-Q n

  Указывает количество секунд для TCP клиента или сервера, в течение которых необходимо выдержать паузу, после получения символа конца файла с удаленного конца, перед тем как закрыть соединение со своей стороны.

-R n

  Устанавливает приемный буфер сокета (опция сокета SO_RCVBUF) в значение n. Это может непосредственно повлиять на размер приемного окна, объявляемого TCP. В случае UDP определяет максимальный размер UDP датаграммы, которая может быть принята.

-S n

  Устанавливает отправляющий буфер сокета (опция сокета SO_SNDBUF) в значение n. В случае UDP определяет максимальный размер UDP датаграммы, которая может быть отправлена.

-U n

  Переводит TCP в режим срочности после осуществления записи номер n в сеть. Для входа в режим срочности записывается один байт данных (глава 20, раздел "Режим срочности (Urgent Mode)").