如何强制“telnet”(在 TCP 模式下)立即发送字节?

Nik*_*nov 2 linux telnet tcp buffer

在 Linux 中,当我运行telnet <address> <port>然后输入内容时,它会缓冲数据,并且仅在我按 Enter 时发送收集的行。此外,它最多可以缓冲 4096 个字符并截断其他所有字符。

我可以通过 tcpdump 或类似的东西监听流量来确认这一点。

是否可以在出现时立即发送字节(如果字符的 UTF-8 编码是多字节,则发送多字节)?我希望在 tcpdump 输出中看到“1 字节”(1 个有效负载字节加标头)TCP 数据包。

或者,至少,是否可以强制它发送不带<cr>或/和<lf>字符的收集的缓冲区?

use*_*686 5

具体来说,客户telnet端被设计为使用 Telnet 协议与 Telnet 服务器通信;如果它从服务器接收到 Telnet IAC WILL SGA / IAC DO SGA,它将切换到字符模式。

或者,您可以按Ctrl]并输入mode character以从客户端启动此操作;客户端将向服务器发送Telnet IAC 协商消息,并切换到逐字符模式。如果服务器不是 Telnet 服务器,这将导致它在您输入之前收到一些垃圾字符。

另一方面,对于像nc或 这样的程序ncat(即不是Telnet 客户端),它将本地 tty 保持在“cooked”模式,这种缓冲是由 tty 而不是由程序完成的。a) 随时按 Ctrl+D 以使 tty 返回到目前为止键入的文本,或者 b)stty raw在启动程序之前将 tty 切换到原始模式(并stty cooked iutf8 -brkint切换回来)。

(Ctrl+D 不仅仅是 EOF 键,它还是“read() 调用结束”键。在空行上按 Ctrl+D 即使 read() 不返回任何内容,才是实际给出 EOF 的原因;而 Ctrl某些输入后的 +D 将仅返回该输入,没有任何尾随的 CR/LF。)