Обработка escape-последовательностей в сеансе Telnet

Я заимствую короткий код C, который устанавливает сеанс telnet с использованием схемы дочерний-родительский и обрабатывает связь между обоими процессами через псевдотерминальное устройство.

Код работает довольно хорошо, но с одним существенным недостатком: процесс telnet не выполняет большинство escape-последовательностей, вместо этого печатая их (ESC печатает ^[[, стрелки ^[[A ^[[B ^[[C ^[[D, так далее.).

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

Базовый код: http://dl.dropbox.com/u/15117414/pty.c


person Marcel Hernandez    schedule 05.02.2013    source источник
comment
Они выглядят как стандартные управляющие коды VT100. Вы должны проверить и разобрать их самостоятельно. Или попросите клиента выполнить собственное редактирование командной строки (что не будет работать с клиентом telnet для Windows).   -  person Some programmer dude    schedule 05.02.2013
comment
Итак, знает ли программа, отображающая данные, об escape-последовательностях? Если бы это было не так, то, что вы описываете, - это именно то, что я ожидал бы...   -  person unwind    schedule 05.02.2013


Ответы (1)


Я решил проблему, и теперь я, наконец, могу поделиться ответом на свой вопрос. Файловый дескриптор, который должен быть переведен в необработанный режим, является стандартным вводом родительского процесса, а не ведомого конца псевдотерминального устройства:

new_term_settings = slave_orig_term_settings;
cfmakeraw(&new_term_settings);
tcsetattr(0, TCSANOW, &new_term_settings);

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

person Marcel Hernandez    schedule 09.02.2013