Реализация основного конечного автомата
Процедура ttwrite реализует конечный автомат, приведенный на рис. 26.4, который интерпретирует данные, поступающие с сервера. Этот код представлен в файле ttwrite.с. играть в игровом автомат онлайн Lost Town
/* Файл ttwrite - процедура ttwrite */
include include include "tnfsm.tr extern struct fsm_trans ttstab[];
extern unsigned char ttfsm[][NCHRS]; extern int ttstate;
При каждом ее вызове процедура ttwrite извлекает сс символов из буфера buf. После извлечения каждого символа в процедуре ttwrite этот символ и текущее состояние (значение переменной ttstate) применяются для определения индекса матрицы переходов. Матрица переходов возвращает ti — индекс перехода в компактном представлении (ttstab). Процедура ttwrite вызывает процедуру» связанную с этим переходом (поле ft_action), и устанавливает текущую переменную в состояние, соответствующее следующему состоянию (поле ftjiext).
Резюме
TELNET принадлежит к числу наиболее широко применяемых прикладных протоколов в наборе протоколов TCP/IP. Он обеспечивает интерактивный обмен символьными сообщениями между клиентом и сервером. Обычно клиентская программа подключает пользовательский терминал к серверу через соединение TCP. В настоящей главе приведен пример клиентского программного обеспечения, функционирующего на основе одного потока выполнения, в котором используется функция операционной системы select для обеспечения параллельного выполнения операций ввода/вывода.
В протоколе TELNET для внедрения в поток данных команд и управляющей информации используются управляющие последовательности. В целях упрощения кода в рассматриваемом примере реализации клиентской программы для интерпретации последовательностей символов применяется три конечных автомата. Один из них обрабатывает данные, поступающие из сервера, другой обрабатывает данные, поступающие с клавиатуры терминала пользователя, а третий обеспечивает уточнение опций.
Пример кода, приведенный в этой главе, может служить иллюстрацией не только к реализации основного клиентского процесса, но и к структурам данных, которые служат для построения конечных автоматов. В следующей главе приведены сведения о процедурах, выполняющих действия, связанные с переходами в конечных автоматах.
Материал для дальнейшего изучения
В документе приведен стандарт основного протокола TELNET, в частности, кодировки сетевого виртуального терминала. В документе даны подробные сведения об операциях согласования опции и уточнения опции. Дополнительную информацию об отдельных опциях можно найти в других документах RFC. В документе описана опция определения типа терминала. В документе рассматривается опция эхо-повтора, а в документе описана опция передачи в двоичном режиме.
В книге описан протокол RLOGIN (разновидность протокола TELNET, применяемая во многих системах UNIX, включая Linux) и показан пример простого клиента и сервера. В книге представлены дополнительные сведения о терминальном вводе/выводе.
Упражнения
- Сравните реализацию клиента TELNET, в которой применяется несколько потоков выполнения в одном процессе, с проектом, представленном в настоящей главе. Каковы преимущества и недостатки каждого из них?
- Прочитайте оперативную документацию, чтобы больше узнать о терминальных устройствах и драйверах устройств. Что такое режим с обработкой (cooked mode), режим с прерыванием после ввода каждого символа (cbreak mode) и режим без обработки (raw mode)?
- Напишите программу, которая отменяет эхо-повтор символов на терминале пользователя. Что происходит с параметром эхо-повтора после завершения работы программы?
- Прочитайте документацию Linux для получения информации о команде stty. Что произойдет после перенаправления вывода из команды stty в файл? Почему?
- Каким образом код, приведенный в файле suspend.с, приостанавливает клиентский процесс?
- Доработайте принципиальную схему конечного автомата и включите в нее состояния, предназначенные для уточнения опций.
- В этом примере реализации конечного автомата для экономного распределения памяти применяется компактное представление. Рассчитайте, какой объем памяти потребуется для реализации рассматриваемой принципиальной схемы конечного автомата с использованием обычного представления, и сравните это значение с объемом памяти, требуемым для компактного представления.
- При каких условиях после выполнения функции read для чтения данных с терминала будет возвращено значение О?
- Прочитайте спецификацию протокола TELNET, чтобы ознакомиться с точными правилами синхронизации. Как отправитель передает срочные данные? Для чего нужна синхронизация?
- В сервере может возникнуть необходимость отправить дополнительные данные после получения от клиента признака конца файла. Каким образом клиент получает информацию о том, что нужно закрыть соединение с сервером?
- Доработайте процедуру ttwrite таким образом, чтобы в ней не использовался конечный автомат. Каковы преимущества и недостатки каждой реализации?