【发布时间】:2021-09-16 11:51:20
【问题描述】:
我正在用 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 见解都值得赞赏!
【问题讨论】:
-
我知道人们使用 telnet 来测试明文 TCP 协议,但在这种情况下,我认为 telnet 只是增加了混淆,例如普通的 netcat (在 Mac 上你可能可以用自制软件得到它)。在 Windows 上,您从 ncat.org 获得的发行版中有一个
ncat二进制文件。