Уточнение опции

Опубликовано в Технологии > Серверные технологии Продолжение

После передачи клиентом согласия на обработку опции типа терминала termtype сервер использует уточнение опции для запроса имени терминала. В отличие от всех обычных опций, имеющих постоянную длину, команда уточнения позволяет отправителю вставить в поток данных строку произвольной длины. Для этого отправитель как бы заключает строку в скобки, передавая заголовок уточнения, данные для конкретного уточнения опции и концевик, который обозначает конец уточнения. Интересное в сети: прекурсори ! ищите тут.

При обнаружении управляющей последовательности уточнения главный конечный автомат (рис. 26.4) переходит в состояние TSSUBNEG. После перехода в состояние TSSUBNEG клиент вызывает процедуру subopt при получении каждого символа. Как показывает код, приведенный в файле subopt.с, в процедуре subopt для выполнения операции уточнения применяется конечный автомат уточнения опции.

/* Файл subopt - процедура subopt */
tinclude 
tinclude 
tinclude "telnet.hH tinclude "tnfsm.h"
extern struct fsm_trans substabf];
extern int substate;
extern u_char        subfsm[][NCHRS];

Передача информации о типе терминала

Для формирования ответа на запрос о типе терминала конечный автомат уточнения опции2 вызывает процедуру subtermtype. Сервер для запроса типа терминала передает управляющую последовательность:

int
subtermtype(FILE *sfp, FILE *tfp, int c) {
/* Получены команды IAC.SB.TERMTYPE.SEND */
(void) putc(TCIAC, sfp); 
(void) putc(TCSB, sfp); 
(void) putc(TOTERMTYPE, sfp); 
(void) putc(TT_IS, sfp); 
fputs(term, sfp); 
(void) putc(TCIAC, sfp);
(void) putc(TCSE, sfp); return 0;
}

После получения запроса SEND конечный автомат уточнения опции вызывает процедуру subtermtype. Перед этим клиент должен был передать положительный ответ на запрос о применении опции типа терминала, поэтому глобальная переменная term уже должна указывать на строку, содержащую обозначение типа терминала. Процедура subtermtype передает ответ, вызывая функцию putc для отправки отдельных управляющих символов и функцию fputs для отправки строки с информацией о типе терминала.

Завершение операции уточнения

При обнаружении признака конца операции уточнения опции конечный автомат, схема которого приведена на рис. 26.4, снова переходит в состояние TSDATA. При выполнении каждого такого перехода вызывается процедура subend. Эта процедура просто переустанавливает конечный автомат уточнения опции в его начальное состояние для подготовки к выполнению следующей операции уточнения опции. Этот код содержится в файле subend.с.

int
subend(FILE *sfp, FILE *tfp, int c) {
substate = SS_START; return 0;
}