Как реализовать завершение табуляции на стороне клиента telnet

У меня есть сервер, который открывает соединения для клиента telnet, например: я запускаю сервер ./server и в другом окне я запускаю клиент telnet как локальный хост telnet 9999, а когда я запускаю клиент telnet, я получу новое приглашение CLI как CLI>>.

Из этой подсказки мне нужно завершение пользовательской вкладки, но многие из блога говорят, что у нас действительно не может быть реализована функция readline на стороне telnet, если так, то у нас есть собственный клиент.

Как мне этого добиться? Любая связанная помощь будет принята с благодарностью. Я использую Linux(Ubuntu) и язык C.

3 ответа

Вы должны перевести клиент telnet в режим char, чтобы он отправлял каждый ключ непосредственно на сервер при вводе (вместо того, чтобы ждать, пока ключ возврата отправит полную строку). Затем, всякий раз, когда вы получаете '\t', проверяйте то, что вы получили до этого '\t', и, в зависимости от того, можете ли вы завершить строку, отправьте обратно полную строку или список возможностей. По сути, вы реализуете readline() на сервере.

Вы можете реализовать это либо на клиенте, либо на сервере.

Для реализации на стороне клиента есть два пути (которые в основном одинаковы):

  1. Когда клиент подключается, сервер отправляет список команд и их аргументов, и это кэшируется в клиенте. Когда пользователь нажимает клавишу TAB, клиент ищет эти кэшированные данные.

  2. Когда клиент замечает нажатие клавиши TAB, он запрашивает у сервера список возможных завершений. Для скорости этот список должен быть кэширован на стороне клиента.

Итак, основное решение здесь: сервер отправляет данные клиенту, клиент показывает данные.


Для реализации на стороне сервера вы должны использовать согласование telnet, чтобы сказать клиенту отправлять необработанные сырые символы и ключи без какого-либо вмешательства на сервер. Затем сервер может проверить ключ TAB и выполнить завершение.

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


Выполнение всей обработки на стороне сервера имеет преимущество, заключающееся в том, что вы можете использовать практически любой клиент telnet (при условии, что он может обрабатывать переговоры telnet), и вам не нужно создавать свой собственный клиент. Недостаток заключается в том, что вам необходимо самостоятельно реализовать все функции редактирования командной строки на сервере, и что задержки при нажатии клавиш могут быть высокими, поскольку каждый ключ должен отправляться на сервер, а затем возвращаться обратно с сервера.

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

После того, как вы telnet host, введите ctrl + ] зайти в командную строку telnet, затем выполнить mode character, После этого клиент telnet переходит в режим "символ за раз", и завершение табуляции должно работать нормально.

sunnogo@a3e420:~$ telnet 192.168.193.88 10015   
Trying 192.168.193.88...  
Connected to 192.168.193.88.  
Escape character is '^]'.  



my_prompt>
my_prompt>

my_prompt>

my_prompt>^]  
telnet> mod character

my_prompt��  
my_prompt>  
my_prompt>  
Другие вопросы по тегам