3

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

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

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

+0

Возможно, вы захотите [узнать больше о протоколе telnet] (http://en.wikipedia.org/wiki/Telnet). Особенно [связанные RFC] (http://en.wikipedia.org/wiki/Telnet#Related_RFCs) (например, для [опции linemode] (http://tools.ietf.org/html/rfc1184)). –

ответ

1

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

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

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

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

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


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

Проблема заключается в том, что тогда вам нужно добавить все изменения в командной строке и запрос в код сервера, и не можете полагаться на клиента, это что угодно, кроме «немого терминала».


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

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

+0

Joachim Я хотел знать, как получить «\ t'in клиента». Большая проблема заключается в том, как собирать символ по символу после установки telnet в режим CHARACTER. – Puneeth

+0

@Puneeth Если вы используете стандартный клиент telnet и он находится в режиме символа, тогда он должен просто отправить вкладку на сервер, как только он ее получит. Если у вас есть пользовательский клиент, то, например, библиотека [GNU readline library] (http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html) поддерживает вкладку (или другой символ, она настраивается) для вызова функции обратного вызова в вашем код. Читайте об [пользовательских дополнениях здесь] (http://cnswww.cns.cwru.edu/php/chet/readline/readline.html#SEC44). –

+0

@Puneeth Если у вас есть пользовательский интерфейс на основе графического интерфейса, тогда графический интерфейс будет иметь функциональные возможности для распознавания ключей, включая вкладку. См. Ссылку для инструментария GUI, который вы используете в этом случае. –

0

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

+0

Можете ли вы рассказать мне, как сделать этот режим линии в режиме символов ... это программирование или руководство. – Puneeth

+0

Проверьте это: http://stackoverflow.com/questions/273261/force-telnet-client-into-character-mode –

+0

Эта ссылка, которую я видел ранее, но не получаю, что делать точно, я новичок в telnet. Мне нужно включить режим символов, но как ... это при выдаче команды telnet .. в telnet localhost 999 ..или это как-то связано с программированием ... или что я должен вводить и где я должен выдавать команду. – Puneeth

0

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

[email protected]:~$ 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> 
Смежные вопросы