@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 ファイルのコピーを作成することです。それを Project Manager のプロジェクトにリンクします。次に、上で概説したようにそのコピーを修正します。