在 Linux 中,当我运行telnet <address> <port>
然后输入内容时,它会缓冲数据,并且仅在我按 Enter 时发送收集的行。此外,它最多可以缓冲 4096 个字符并截断其他所有字符。
我可以通过 tcpdump 或类似的东西监听流量来确认这一点。
是否可以在出现时立即发送字节(如果字符的 UTF-8 编码是多字节,则发送多字节)?我希望在 tcpdump 输出中看到“1 字节”(1 个有效负载字节加标头)TCP 数据包。
或者,至少,是否可以强制它发送不带<cr>
或/和<lf>
字符的收集的缓冲区?
具体来说,客户
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。)