Telnet 服务器回显选项导致不需要的空格

Telnet server echo option leads to unwanted whitespace

我正在用 Rust 构建一个 telnet 服务器。我希望服务器能够显示文本文件并响应从客户端发送的自定义单字符命令。用户应该能够只按下一个键并让服务器响应——他们不应该看到他们的输入,所以我使用了 telnet ECHO 选项,这样客户端就不会显示用户的输入。 但是,在我发送回显选项后,每当我打印文件或某些字符串时,都会插入额外的空格。

我已经压缩了代码来隔离问题:

文件:main.rs

fn main() -> std::io::Result<()> {

    let listener = TcpListener::bind("127.0.0.1:4321")?;

    for stream in listener.incoming() {
        let mut stream = stream?;

        let contents = fs::read_to_string("file.txt")
            .expect("Couldn't find file.");

        // This array is [255, 251, 01]
        stream.write(&[IAC.byte(), WILL.byte(), Echo.byte()])?;
        stream.write(contents.as_bytes())?;
        // This array is [255, 252, 01]
        stream.write(&[IAC.byte(), WONT.byte(), Echo.byte()])?;
        stream.write(contents.as_bytes())?;
    }
    Ok(())
}

文件:file.txt

Hello
This
Is
A
File.

当我 运行 通过 telnet 在本地连接时:

celie:~$ telnet localhost 4321
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello
     This
         Is
           A
            File.
                 Hello
This
Is
A
File.
Connection closed by foreign host.

我可以在将 telnet 代码写入流时重新排列,并且我使用了其他 telnet 选项并从客户端获得了有效响应,但是一旦我说“WILL Echo”,所有后续输出都会得到所有这些额外的空格,直到我说“WONT Echo”。

我希望文件简单地正常显示,换行符后不添加空格,这在我不使用 echo 选项时有效,即使我使用其他 telnet 选项也是如此。

空白似乎根本不应该与 echo 选项相关!感谢任何 telnet 见解!

您所做的与本地终端上的“原始模式”大致相同(应用程序使用它来禁用回显和行编辑并自行处理输入)— 在这种情况下,server/application 是负责在行尾发送 两个 控制字符,而通常 OS 内核会为您完成此操作。

你必须发送一个回车符return ("\r"),它将光标移动,以及一个换行符("\n") , 它将光标 向下移动。 您只发送换行符(这是现代文本文件的常规做法),因此光标向下移动但不会向左移动。如果您发送了一个较长的文件,您会注意到文本会环绕右边缘,但总是在前一行的末尾下方开始新的一行。

当您将文本复制到 TCP 流时,您必须检查换行符并插入必要的回车 returns。