4

Indy10 - DelphiXE を使用。TIdTelnet接続している telnet サーバーに、telnet サーバーに向けて送信したコマンドをエコーし​​ないようにするにはどうすればよいですか?

これは私の現在の試みです (これは機能しません)。各 telnet 書き込みでシーケンス IAC DO SUPPRESS_LOCAL_ECHO を送信しようとしていますが、これはネゴシエーション フェーズで行う必要があると思いますか?

uses
  TIdTelnet,

...
procedure TIOTelnetConnection.SendSupressEcho;

var
  Resp: TIdBytes;

begin
 SetLength(Resp, 3);
 Resp[0] := TNC_IAC;
 Resp[1] := TNC_DO;
 Resp[2] := TNO_SUPLOCALECHO;
 FIOConnection.IOHandler.Write(Resp);
end;

procedure TIOTelnetConnection.Write(Str: AnsiString);
begin
 SendSupressEcho;
 if Str <> '' then
  FIOConnection.IOHandler.Write(Str);
end;

TIdTelnetソースを見ると手順Negotiateが表示されますが、保護されています。その動作をオーバーライドするにはどうすればよいですか?

4

3 に答える 3

0

@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 のプロジェクトにリンクします。次に、上で概説したようにそのコピーを修正します。

于 2013-08-14T07:48:31.190 に答える