如何通过TIdTelnet组件在Delphi中有效抑制远程终端的回声问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计606个文字,预计阅读时间需要3分钟。
使用Indy10和DelphiXE,若与TIdTelnet连接的telnet服务器不响应您发送给服务器的命令,可能是因为命令发送方式或服务器配置问题。以下是一些可能的解决方案:
1. 确保命令格式正确。telnet命令通常以IAC(Interpret As Command,即 interpret as command)开始,后跟命令代码和参数。例如,IAC + DO + SUPPRESS_LOCAL_ECHO 表示抑制本地回显。
2. 检查telnet服务器的配置,确保它允许接收和执行命令。
3. 使用TIdTelnet的`WriteString`方法发送命令,确保命令以IAC字符开始,并正确格式化。
示例代码如下:
delphivar Telnet: TIdTelnet; Command: string;begin Telnet :=TIdTelnet.Create; try Telnet.Host :='telnet服务器地址'; Telnet.Port :=23; // 默认telnet端口 Telnet.Connect;
// 发送命令 Command :=#27 + 'IAC' + #13 + 'IAC' + 'DO' + 'SUPPRESS_LOCAL_ECHO' + #13; Telnet.WriteString(Command);
// 读取响应 // ... finally Telnet.Free; end;end;
请根据实际情况调整服务器地址、端口和命令内容。如果问题依旧,可能需要进一步检查telnet服务器的配置或寻求技术支持。
使用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程序,但它受到保护,我该如何覆盖它的行为?
如果服务器向您发送IAC WILL ECHO,TIdTelnet将被硬编码为发送IAC DO ECHO响应,然后触发OnTelnetCommand(tncNoLocalEcho)事件,告诉您不要在本地回显您发送的内容.如果服务器向您发送IAC WONT ECHO,TIdTelnet将被硬编码为发送IAC DONT ECHO响应,然后触发OnTelnetCommand(tncLocalEcho)事件以告知您本地回显您发送的内容.
如果服务器向您发送IAC DO ECHO,TIdTelnet将被硬编码为发送IAC WILL ECHO响应,然后触发OnTelnetCommand(tncEcho)事件以告知您回显您收到的任何内容.
如果服务器向您发送IAC DONT ECHO,TIdTelnet将被硬编码为发送IAC WONT ECHO响应,然后触发OnTelnetCommand(tncLocalEcho)事件以告知您回显您收到的任何内容.
因此,如果您不希望服务器回显给您,您可以向服务器发送IAC DONT ECHO命令,而不是IAC DO SUPLOCALECHO命令.然后,服务器将相应地回复IAC WONT ECHO或IAC WILL ECHO(显然TIdTelnet将回复,但由于其ECHO当前状态不会改变,服务器将不会再次响应,从而避免无休止的响应循环).
本文共计606个文字,预计阅读时间需要3分钟。
使用Indy10和DelphiXE,若与TIdTelnet连接的telnet服务器不响应您发送给服务器的命令,可能是因为命令发送方式或服务器配置问题。以下是一些可能的解决方案:
1. 确保命令格式正确。telnet命令通常以IAC(Interpret As Command,即 interpret as command)开始,后跟命令代码和参数。例如,IAC + DO + SUPPRESS_LOCAL_ECHO 表示抑制本地回显。
2. 检查telnet服务器的配置,确保它允许接收和执行命令。
3. 使用TIdTelnet的`WriteString`方法发送命令,确保命令以IAC字符开始,并正确格式化。
示例代码如下:
delphivar Telnet: TIdTelnet; Command: string;begin Telnet :=TIdTelnet.Create; try Telnet.Host :='telnet服务器地址'; Telnet.Port :=23; // 默认telnet端口 Telnet.Connect;
// 发送命令 Command :=#27 + 'IAC' + #13 + 'IAC' + 'DO' + 'SUPPRESS_LOCAL_ECHO' + #13; Telnet.WriteString(Command);
// 读取响应 // ... finally Telnet.Free; end;end;
请根据实际情况调整服务器地址、端口和命令内容。如果问题依旧,可能需要进一步检查telnet服务器的配置或寻求技术支持。
使用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程序,但它受到保护,我该如何覆盖它的行为?
如果服务器向您发送IAC WILL ECHO,TIdTelnet将被硬编码为发送IAC DO ECHO响应,然后触发OnTelnetCommand(tncNoLocalEcho)事件,告诉您不要在本地回显您发送的内容.如果服务器向您发送IAC WONT ECHO,TIdTelnet将被硬编码为发送IAC DONT ECHO响应,然后触发OnTelnetCommand(tncLocalEcho)事件以告知您本地回显您发送的内容.
如果服务器向您发送IAC DO ECHO,TIdTelnet将被硬编码为发送IAC WILL ECHO响应,然后触发OnTelnetCommand(tncEcho)事件以告知您回显您收到的任何内容.
如果服务器向您发送IAC DONT ECHO,TIdTelnet将被硬编码为发送IAC WONT ECHO响应,然后触发OnTelnetCommand(tncLocalEcho)事件以告知您回显您收到的任何内容.
因此,如果您不希望服务器回显给您,您可以向服务器发送IAC DONT ECHO命令,而不是IAC DO SUPLOCALECHO命令.然后,服务器将相应地回复IAC WONT ECHO或IAC WILL ECHO(显然TIdTelnet将回复,但由于其ECHO当前状态不会改变,服务器将不会再次响应,从而避免无休止的响应循环).

