Уточнение опции
После передачи клиентом согласия на обработку опции типа терминала 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;
}