4

我正在 Arduino 上编写一个小的 Telnet 客户端。使用以下代码停用 Telnet 客户端线路模式后,如何重新激活它?

  client.write(255); // IAC
  client.write(251); // WILL
  client.write(1);   // ECHO

  client.write(255); // IAC
  client.write(251); // WILL
  client.write(3);   // suppress go ahead

  client.write(255); // IAC
  client.write(252); // WONT
  client.write(34);  // LINEMODE

用于输入密码。

我尝试了反向命令,但它们不起作用。

4

1 回答 1

1

使用 BSD telnet 客户端,使用以下命令:

set debug
set prettydump
set options
set netdata

然后,可以使用命令切换一次字符模式和一次一行模式,

mode line
mode character

接下来的协商可以被检查和复制。

但是,只发送 IAC DONT ECHO、密码、CR NUL 和 IAC DO ECHO 就足够了。使用“WILL ECHO,WILL SGA”进入“一次一个字符”模式称为“kludge 模式”——重新启用 ECHO 应默认为标准 NVT 行为(线路模式)。

但是,bsd 客户端具有完整的扩展线模式支持。这不是微不足道的,将近 50% 的代码库(forwardmask、slc、回调等)。

如果服务器回复 WONT LINEMODE,那么它实际上仍处于默认 NVT 线路模式——它只是不在增强线路模式或不关心协商它。这就是为什么发送 DO LINEMODE 实际上是一个糟糕的主意,因为您需要从后来的 rfc 中确认 linemode 的子协商协议。

回复 DO LINEMODE 的服务器可能会继续请求 linemode 子协商,例如 IAC SB LINEMODE MODE <1 byte bitmask> 和 IAC SB LINEMODE FORWARDMASK 。使用 WONT FORWARDMASK 拒绝此响应。MODE 必须设置 ACK 位并以类似方式回复。

于 2013-05-18T01:27:47.910 回答