@Remy Lebeau:据我了解,您是在说:
如果服务器发送一个 IAC DO ECHO 给你,TIdTelnet 被硬编码发送一个 IAC WILL ECHO 响应,然后触发一个 OnTelnetCommand( tncEcho ) 事件告诉你回显您收到的任何内容。
这是有道理的,并且与 RFC857 所要实现的目标一致......
但是,在我们的代码中:
procedure TIdTelnet.Negotiate;
...
TNC_DONT:
begin
b := IOHandler.ReadByte;
case b of
TNO_ECHO:
begin
DoTelnetCommand(tncEcho);
//DoStatus('ECHO'); {Do not Localize}
Reply := TNC_WONT;
end;
else
Reply := TNC_WONT;
end;
和
TNC_DO:
begin
b := IOHandler.ReadByte;
case b of
TNO_ECHO:
begin
Reply := TNC_WILL;
DoTelnetCommand(tncLocalEcho);
end;
这个代码肯定不正确吗? (在 Indy 的 10.6.0.497 版本中)
我相信这会更有意义:
procedure TIdTelnet.Negotiate;
...
TNC_DONT:
begin
b := IOHandler.ReadByte;
case b of
TNO_ECHO:
begin
// Agree not to echo back everything received from server
// (This being the default - you shouldn't echo unless asked to)
Reply := TNC_WONT;
// Therefore only print locally what is sent to server
// (Again: this is the default behavior without negotiation)
DoTelnetCommand(tncLocalEcho);
end;
else
Reply := TNC_WONT;
end;
和
TNC_DO:
begin
b := IOHandler.ReadByte;
case b of
TNO_ECHO:
begin
// Agree to echo back everything received from server
Reply := TNC_WILL;
DoTelnetCommand(tncEcho);
// Therefore you may still have to locally print what you send
// (i.e. local echo is usually still implicit in this)
end;
换句话说,我相信代码现在已经从它应该是交换的 - 即发送 DO ECHO 的服务器应该得到 tncEcho 令牌 - 这就是你在上面的引用中所说的!
这个错误是如何存活这么久的? (可能是因为大多数 Telnet 服务器不再需要 RFC857 回显协商)
不幸的是,目前我认为“补偿”此错误的唯一方法是创建 IDTelnet.pas 文件的副本;在项目管理器中将其链接到您的项目;然后按照上面的说明对该副本进行更正。