Передача символа на сервер

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

Если передача ведется в двоичном режиме, вставка символов должна выполняться только применительно к символам IAC в потоке данных. Это означает, что процедура soputc должна заменять каждый символ IAC двумя символами IAC. Что касается любых других символов, то процедура soputc просто вызывает функцию putc для их передачи. входные двери для Ногинске

Если передача ведется в обычном режиме, локальный набор символов должен быть преобразован процедурой soputc в набор символов сетевого виртуального терминала. Например, если поступающий символ соответствует либо символу прерывания, либо управляющему символу, процедура soputc передает двухсимвольную последовательность:

IAC IP 

В этой процедуре выполняется явная проверка каждого из специальных символов, которые определены в кодировке NVT. Процедура soputc должна также обрабатывать символы, для которых отсутствует кодировка NVT. Однако в протоколе NVT указано, что если сервер не требует выполнения клиентом передачи в двоичном режиме, сервер должен отбрасывать основную часть управляющих символов, вводимых пользователем.

Отображение входящих данных на терминале пользователя

Данные, поступающие через соединение TCP от сервера, могут быть либо не-закодированными (если сервер дал согласие на передачу в двоичном режиме), либо они могут состоять из символов, закодированных в соответствии с правилами, установленными протоколом NVT. Клиент вызывает процедуру ttputc для отображения входящих символов на экране пользователя. /* Файл ttputc - процедура ttputc */

Если сервер дал согласие на передачу данных в двоичной кодировке, процедура ttputc для их отображения вызывает процедуру xputc. Этот код содержится в файле xput.c.

int
xputc(char ch, FILE *fp) {
if (scrfp)
(void) putc(ch, scrfp); return putc(ch, fp);
}

Процедура xputc отличается от обычной функции putc, поскольку клиент в ней предоставляет средства поддержки ведения протокола. Если поддержка ведения протокола разрешена, процедура xputc выводит копию выходного символа и на терминал, и в файл протокола. В ином случае, она выводит копию только на терминал.

Если сервер не передает двоичные данные, процедура ttputc должна преобразовать символы из кодировки NVT в символьную последовательность, соответствующую терминалу пользователя. При этом могут возникнуть две ситуации: клиент может находиться в обычном режиме или в режиме синхронизации. Клиент переходит в режим синхронизации после получения команды TELNET SYNCH. Находясь в режиме синхронизации, клиент читает и отбрасывает все данные. Клиент снова переходит в обычный режим после получения команды DATA MARK протокола TELNET.

Сервер передает команду SYNCH в виде срочных данных. При поступлении этих срочных данных, предназначенных для клиента, операционная система передает клиенту сигнал SIGURG, что вынуждает клиента вызвать на выполнение обработчик сигнала rcvurg. Процедура rcvurg устанавливает глобальную переменную synching, что вынуждает клиента перейти в режим синхронизации и искать очередной символ DATA MARK в потоке данных. В режиме синхронизации клиент отбрасывает весь ввод и не отображает его. Поэтому процедура ttputc проверяет переменную synching и отбрасывает каждый выходной символ, если значение этой переменной отлично от нуля.

После проверки того, находится ли клиент в режиме синхронизации, процедура ttputc должна интерпретировать остальные символы с использованием кодировки NVT. Поскольку в кодировке NVT частично используются двухсим-вольные последовательности, процедура ttputc хранит копию предыдущего символа в глобальной переменной last_char.

Вначале процедура ttputc обрабатывает символы возврата каретки (CR — сокращение от carriage return) и перевода строки (LF — сокращение от linefeed). Она распознает, обозначают ли двухсимвольные последовательности CR-LF или LF-CR конец строки, и преобразует их в один символ LF в соответствии с соглашением, принятым в операционной системе Linux. Безусловно, если встречается отдельный символ возврата каретки или перевода строки, процедура ttputc выполняет действие, связанное с этим символом. Для этого в ней вызывается процедура tcout с указанием в качестве первого параметра операции перемещения курсора. Например, при обнаружении символа перевода строки процедура ttputc вызывает процедуру tcout со строковым параметром do (сокращение от down — вниз).

Процедура ttputc вызывает процедуру xputc для непосредственного вывода любых печатаемых символов ASCII. В ином случае она выполняет обработку специальных символов. Например, если символ, предназначенный для вывода на экран, представляет собой символ NVT BEL (в коде этой процедуры — VPBEL), процедура ttputc вызывает процедуру tcout с применением параметра.