@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 文件的副本;在项目管理器中将其链接到您的项目;然后按照上面概述的方式对该副本进行更正。