我有一个服务器可以打开telnet客户端的连接,比如
例如:
我运行服务器./server
,在另一个窗口中我运行telnet客户端作为telnet localhost 9999,
当我运行telnet客户端时,我将以CLI>>。
从这个提示我需要自定义标签完成,但许多博客说我们真的没有在telnet端实现readline功能,如果是这样我们就去了我们自己的客户端。
我如何实现它?任何相关的帮助将不胜感激。我使用的是linux(Ubuntu)和C语言。
答案 0 :(得分:1)
您可以在客户端或服务器上实现此功能。
对于客户端实现,有两种方式(基本相同):
当客户端连接时,服务器会发送一个命令列表及其参数,并在客户端中缓存。当用户按下 TAB 键时,客户端会搜索此缓存数据。
当客户端注意到 TAB 键被按下时,它会要求服务器提供可能的完成列表。为了速度,这个列表应该缓存在客户端。
所以这里的基本解决方案是:服务器向客户端发送数据,客户端显示数据。
对于服务器端实现,您必须使用telnet协商来告诉客户端发送未经烹煮的原始字符和密钥,而不会对服务器造成任何干扰。然后服务器可以检查 TAB 键并执行完成。
这里的问题是,你必须在服务器代码中添加所有命令行编辑和提示,并且不能依赖客户端只是一个“哑终端”。
完成服务器端的所有处理后,您可以使用几乎任何telnet客户端(只要它可以处理telnet协商)并且不必创建自己的自定义客户端。缺点是您必须自己在服务器中实现整个命令行编辑功能,并且按键的延迟可能很高,因为必须将每个密钥发送到服务器,然后从服务器回送。
拥有一个自定义客户端有一个好处,即有一些库可以轻松处理命令行编辑并帮助完成。这里的主要缺点是你必须制作一个自定义客户端。
答案 1 :(得分:1)
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>
答案 2 :(得分:0)
您必须将telnet客户端置于char模式,因此它在键入时将每个密钥直接发送到服务器(而不是等待返回密钥发送完整的行)。然后,每当您收到'\ t'时,检查在'\ t'之前收到的内容,并根据您是否可以完成该行,发回完整的行或可能的列表。基本上,您正在服务器中实现readline()。