Конечный автомат для уточнения опции
На рис. 26.9 показан третий конечный автомат, используемый в клиенте. Он обрабатывает последовательность символов, поступающую во время уточнения опции. Поскольку этот конечный автомат распознает лишь один возможный запрос на уточнение опции (тип терминала), для него требуются только три состояния. Клиентская программа выполняет повторную инициализацию этого конечного автомата после каждого очередного уточнения опции. Дилайт рекомендует: отдых и туры в вену в феврале.

Проще всего можно понять, что такое уточнение опции, если представить себе, что эта операция описывает внутреннюю структуру состояния TSSUBNEG в приведенной выше принципиальной схеме конечного автомата. В то время как основной конечный автомат функционирует в состоянии TSSUBNEG, он вызывает процедуру subopt для обработки каждого входящего символа. Процедура subopt обращается к конечному автомату, уточняющему опцию. Как показано на рис 26.9, конечный автомат, предназначенный для уточнения опции, немедленно принимает решение в зависимости от опции. Если конечный автомат обнаруживает уточнение опции с обозначением типа терминала, он переходит в состояние SSJTERMTYPE. В ином случае он переходит непосредственно в состояние SSJ3ND и игнорирует оставшуюся часть строки уточнения функции.
После перехода в состояние SSJTERMTYPE конечный автомат проверяет глагол уточнения опции. Он вызывает процедуру subtermtype, если глаголом является TTJSEND, а в ином случае игнорирует запрос на уточнение опции. Назначение и функционирование конечного автомата для уточнения опции станут более понятными после рассмотрения того, как клиент отвечает на запрос опции с указанием типа терминала.
Инициализация конечного автомата
С началом выполнения клиентской программы вызывается процедура f smbuild для инициализации всех конечных автоматов. Как показывает код, приведенный в файле ttinit.c, процедура fsmbuild вызывает процедуру fsminit для построения требуемых структур данных всех конечных автоматов и устанавливает начальное значение переменной состояния каждого конечного автомата.
int
fsmbuild() {
fsminit(ttfsm, ttstab, NTSTATES); ttstate = TSDATA;
fsminit(sofsm, sostab, NKSTATES); sostate = KSREMOTE;
fsminit(subfsm, substab, NSSTATES); substate = SS START;
}
Параметры клиентской программы TELNET
Файл tclient.c содержит код главной процедуры, которая выполняется при вызове пользователем клиентской программы TELNET:
/* Файл tclient - главная процедура */ include char *host = "localhost"; /* Применяемое по умолчанию имя хоста */ int errexit(const char *format, ...); int telnet(const char *host, const char *service);
Пользователь может не ввести ни одного параметра командной строки либо ввести один или два параметра командной строки, которые интерпретируются программой. При отсутствии параметров (argc=l) клиент обращается к серверу на локальном хосте и использует службу telnet. При наличии одного параметра (argc*2) клиент использует этот параметр в качестве имени удаленного хоста, на котором работает сервер. И наконец, при получении двух параметров клиент рассматривает второй параметр как имя службы на удаленном компьютере, а первый параметр — как имя удаленного хоста. После интерпретации параметров в главной процедуре вызывается функция telnet.