2

我正在用 C# 实现一个简单的概念验证 Telnet 服务器,并通过内置在 telnet 客户端的 windows 远程登录到它。我将所有非 IAC 数据回显给客户端。但是,我无法弄清楚如何让退格/删除正常工作。我尝试了几种从 telnet 客户端作用于“BS”的组合:

  • 'BS'(将光标向后移动一个但不删除字符)
  • 'BS''DEL'(仅与 'BS' 相同的结果)
  • 'BS''DEL''ESC[3~' (结果相同)

谁能告诉我退格和从屏幕上删除角色的正确控制顺序是什么?

谢谢,

汤姆

4

4 回答 4

6

多年来,我一直试图弄清楚这一点,但如果打开回声,它实际上非常简单。当\b检测到(退格)时。您可以发送(通过套接字):

Socket.Send(new byte[] { 0x08, 0x20, 0x08 });

0x08发送退格,这是一个非破坏性的退格,它只是将光标移动到左边。0x20发送一个删除该字符的空格,然后退格再次将光标移回左侧。奇迹般有效!

干杯

于 2011-05-20T23:55:03.370 回答
2

删除和退格的行为取决于服务器的终端仿真。此外,在客户端中点击退格和/或删除可能会或可能不会将实际的退格和删除键码发送到服务器,这取决于它认为仿真是什么。我不相信有一个终端不可知的命令来移动一个字符并删除最后一个字符。 这是一个很好的问题讨论。

最后,不要使用 Windows 内置的 telnet 客户端。糟透了。我更喜欢 Van Dyke 的SecureCRT,但如果你不想花钱,PuTTY是一个受欢迎的免费客户端。

于 2009-11-06T19:03:08.230 回答
1

我刚刚连接到 Cisco 交换机并跟踪 IOS 是如何实现它的。IOS 在来自客户端的传入“BS”上发送“BS”“SPACE”“BS”。所以,这就是我现在实现它的方式并且效果很好。

于 2009-11-07T17:28:41.617 回答
1
static uint8_t space = 0x20;
static uint8_t BS = 0x08;

if (ui8Char == 0x08)
{
if (i != 0) i--;
tcp_write(pState->pConnectPCB, &BS, 1, 1); 
tcp_write(pState->pConnectPCB, &space, 1, 1); 

它会删除您在终端和缓冲区中回显的数据。首先检查退格并减少缓冲区,然后使用 BS 和空格。它非常适合 Telnet。您不必更改 teraterm 或腻子中的任何内容。

于 2017-06-09T14:26:21.977 回答