代码之家  ›  专栏  ›  技术社区  ›  TJF

telnet服务器->退格/删除不工作

  •  1
  • TJF  · 技术社区  · 16 年前

    我在C语言中实现了一个简单的概念验证telnet服务器,并通过Windows内置的telnet客户机向它提供telnet。 我将所有非IAC数据回传给客户。但是,我不知道如何让backspace/delete正常工作。 我从telnet客户端尝试了几种对“bs”的组合:

    • “bs”(将光标向后移动一个,但不删除字符)
    • 'bs''del'(仅与'bs'结果相同)
    • 'bs''del''esc[3~'(相同结果)

    有人能告诉我退格键和删除屏幕上的字符的正确控制顺序是什么吗?

    谢谢,

    汤姆

    4 回复  |  直到 9 年前
        1
  •  5
  •   Mr.Wizard naktepe    15 年前

    我很长时间都在想办法解决这个问题,但如果Echo打开的话,就非常简单了。当A \b 检测到(退格键)。您可以(通过套接字)发送:

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

    0x08 发送退格,这是一个非破坏性的退格,它只是将光标向左移动。 0x20 发送删除该字符的空格,然后退格键再次将光标移回左侧。真是魅力四射!

    干杯

        2
  •  2
  •   Jherico    16 年前

    删除和退格的行为取决于服务器的终端仿真。此外,在客户机中点击backspace和/或delete可能会或可能不会向服务器发送实际的backspace和delete键码,这取决于它认为仿真是什么。我不相信有一个终端的不可知命令移动回一个字符和删除最后一个字符。 Here's 对这个问题的充分讨论。

    最后,不要使用Windows内置的telnet客户端。它很烂。我喜欢范戴克的 SecureCRT 但是如果你不想花钱, PuTTY 是一个受欢迎的免费客户。

        3
  •  1
  •   TJF    16 年前

    我刚连接到一个Cisco交换机,跟踪iOS是如何实现它的。 IOS正在从客户端传入的“bs”上发送“bs”空间“bs”。所以,这就是我现在实现它的方法,而且效果很好。

        4
  •  1
  •   Faizan11    9 年前
    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。你不必用畸胎或油灰来改变任何东西。