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

14

我有一个应用程序,可以接受来自Telnet客户端的套接字连接,并提供一个简单的基于键盘驱动的字符 GUI。

至少在Linux上,默认情况下,Telnet客户端会进入逐行模式,因此我总是需要手动执行^]mode char命令。

相关RFC的简要浏览表明,如果我的应用程序在客户端连接时发送字符IAC DONT LINEMODE (\377\376\042),则应该将客户端强制切换到字符模式。但是,这并没有起到任何作用。

最简单的代码是什么?理想情况下,只需发送一个字符串就可以了。我的应用程序可以吸收客户端发回的任何垃圾信息。


如何在 Telnet 中进入字符模式?您可以使用命令“^]mode char”来实现。 - Thufir
3个回答

10
有趣。我发送信息的运气更好。
IAC WILL ECHO IAC WILL SUPPRESS_GO_AHEAD IAC WONT LINEMODE
255  251    1 255  251                 3 255  252       34

IAC WONT LINEMODE似乎是多余的:我的Telnet客户端似乎可以在不使用它的情况下达到正确状态,但出于完整性考虑,我仍然保留了它。


我不太明白为什么这样会起作用。我猜测去掉go-ahead命令会使它变成一个“现代化”的telnet连接,但为什么回显很重要...我毫无头绪。谢谢你,无论你在哪里,Jack。 - undefined

8

说句实话,我自己解决了这个问题。

// IAC WONT LINEMODE IAC WILL ECHO

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

将远程(至少在Linux桌面的Xterm上使用telnet)置于正确状态。


3

Kevin的解决方案非常好:

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

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

// IAC DO LINEMODE IAC WILL ECHO

(来源:rfc854)


默认状态相当于每个 Telnet 连接的基本网络虚拟终端 (NVT),在连接时,每个端点都应该表现得像 一切 都被禁用了,除非已经同意了一个端点提供的选项,并且另一个端点的 DO 回复和/或同一选项已经被请求并在对方的 WILL 中回复。当然,一个方向上的选项与另一个方向上的选项是分开的 - 除了 ECHO 是一个 特殊 情况... - SlySven
...并且不允许(无法回忆是SHOULD NOT还是MUST NOT)在一个方向上进行ECHO,如果相反的方向已经处于ECHO模式下! - SlySven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接