Приложение C Программа sock
Для генерации TCP и UDP данных использовалась
простая тестовая программа, называемая sock.
Она выполняла функции как клиента, так и сервера.
С помощью этой тестовой программы, которую можно
запустить из приглашения shellа, мы избежали
необходимости писать новые программы клиента и
сервера на языке программирования C для каждой
специальной характеристики, которую хотели
протестировать. Так как цель этой книги -
понимание сетевых протоколов, а не сетевого
программирования, в этом приложении мы
ограничимся описанием программы и ее опций.
Существует
определенное количество программ, функционально
похожих на sock. Juergen Nickelsen написал
программу, которая называется socket, а Dave Yost программу sockio. Обе
реализуют много похожих функций. Части программы
sock также были получены из свободно
распространяемой программы ttcp,
написанной Mike Muuss и Terry
Slattery.
Программа sock может работать в одном из
четырех режимов:
- Интерактивный клиент: по умолчанию.
Программа подсоединяется к серверу и затем
копирует стандартный ввод на сервер и копирует
все, что получено от сервера, на стандартный
вывод. Это показано на рисунке С.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)").