强制 telnet 客户端进入字符模式

Posted

技术标签:

【中文标题】强制 telnet 客户端进入字符模式【英文标题】:Force telnet client into character mode 【发布时间】:2010-09-21 08:33:59 【问题描述】:

我有一个应用程序,我在其中接受来自 telnet 客户端的套接字连接并建立一个简单的键盘驱动字符 GUI。

telnet 客户端,至少在 Linux 上,默认为一次一行的模式,所以我总是必须手动执行^]mode char

浏览相关 RFC 表明,如果我的应用程序只是在客户端连接后立即发送字符 IAC DONT LINEMODE (\377\376\042),则应强制客户端进入字符模式。但是,它没有任何区别。

完成这项工作的最简单的代码是什么?理想情况下只是一个要发送的字符串。我的应用程序可以吸收客户端发回的任何垃圾。

【问题讨论】:

在 telnet 上进入字符模式,你如何“做”^]mode char ? 【参考方案1】:

有趣。我有更多的运气发送

IAC WILL ECHO IAC WILL SUPPRESS_GO_AHEAD IAC WONT LINEMODE
255  251    1 255  251                 3 255  252       34

IAC WONT LINEMODE 似乎是多余的:没有它,我的 telnet 客户端似乎可以进入正确的状态,但为了完整起见,我将其保留。

【讨论】:

【参考方案2】:

为了它的价值,我自己解决了。

// IAC WONT LINEMODE IAC WILL ECHO

write(s,"\377\375\042\377\373\001",6);

使远程(至少从 Linux 机器上的 Xterm 远程登录)进入正确状态。

【讨论】:

【参考方案3】:

Kevin 的解决方案效果很好:

write(s,"\377\375\042\377\373\001",6);

虽然评论有点错误。它应该说“DO LINEMODE”,而不是“WONT LINEMODE”,即:

// IAC DO LINEMODE IAC WILL ECHO

(来源:rfc854)

【讨论】:

默认状态相当于 NVT(基本网络虚拟终端),Telnet 连接的每一端都应该在连接时表现出 everything 禁用,并且什么都没有启用,直到一端提供的选项已与他们的 WILL 和另一端的 DO 答复达成一致,和/或同一端希望另一端做的相同选项已与他们的 DO 和另一端的 WILL 一起请求回复。当然,一个方向上的选项与另一个方向上的相同选项是分开的——除了 ECHO 是一个特殊情况...... ...如果反向已经处于 ECHO 模式,则不允许(不记得它是应该还是不能)在一个方向上 ECHO!

以上是关于强制 telnet 客户端进入字符模式的主要内容,如果未能解决你的问题,请参考以下文章

telnet客户端模拟浏览器发送请求

IE 页面被强制进入 IE7 文档模式

telnet2222端口不通

telnet命令不能使用怎么办

Python telnetlib 客户端似乎没有打开到服务器的 telnet 连接

如何使用telnet测试端口号