在 Linux 中,当我运行telnet <address> <port>
并输入内容时,它会缓冲数据,并且仅在我按下 Enter 时发送收集的行。此外,它最多缓冲 4096 个字符并截断其他所有内容。
我可以通过 tcpdump 或类似程序监听流量来确认这一点。
当字符出现时,是否可以立即发送字节(或多字节,如果字符的 UTF-8 编码是多字节)?我希望在 tcpdump 输出中看到“1 字节”(1 个有效负载字节加上标头)TCP 数据包。
或者,至少,是否可以强制它发送不带<cr>
或/和<lf>
字符的收集缓冲区?
答案1
具体来说,客户telnet
端设计用于使用 Telnet 协议与 Telnet 服务器通信;如果它从服务器收到 Telnet IAC WILL SGA / IAC DO SGA,它将切换到字符模式。
或者,您可以按下Ctrl]并输入mode character
从客户端启动此操作;客户端将发送 Telnet IAC 协商消息到服务器将切换到逐字符模式。如果服务器不是 Telnet 服务器,这将导致它在您输入之前收到一些垃圾字符。
另一方面,对于类似nc
或ncat
(即不是Telnet 客户端)将本地 tty 保持在“熟”模式,此缓冲由 tty 完成,而不是由程序完成。a) 在任何时候按 Ctrl+D 使 tty 返回到目前为止输入的文本,或者 b) 使用stty raw
在启动程序之前将 tty 切换到原始模式(并stty cooked iutf8 -brkint
切换回来)。
(Ctrl+D 不仅仅是 EOF 键,它还是“read() 调用结束”键。在空的行,即使 read() 不返回任何内容,这实际上给出了 EOF;而在某些输入之后按 Ctrl+D 将仅返回该输入,而不返回任何尾随的 CR/LF。)