如何使用 TIdTelnet 发送命令?
Posted
技术标签:
【中文标题】如何使用 TIdTelnet 发送命令?【英文标题】:How do I use TIdTelnet to send commands? 【发布时间】:2011-04-28 21:52:35 【问题描述】:我正在尝试从我的程序中模拟 Vidalia(Tor GUI)中的“新身份”按钮。 I asked about that,根据 Rob Kennedy 的回答,我在我的应用程序中尝试了这个:
IdTelnet1.Host:='127.0.0.1';
IdTelnet1.Port:=9051;
IdTelnet1.Connect(-1);
IdTelnet1.SendCmd('SIGNAL NEWNYM');
但它对我不起作用。即使在我发送命令之后,我也会得到相同的代理。
我正在使用 Indy 9。
我不知道我是不知道如何使用 TIdTelnet 还是不知道如何发送该特定命令。
【问题讨论】:
【参考方案1】:您不能将 SendCmd() 方法与 TIdTelnet 一起使用。 TIdTelnet 使用内部读取线程,不断从套接字中读取数据(因为 Telnet 是一个异步协议,可以随时接收数据)。 SendCmd() 进行自己的内部读取以接收已发送命令的响应。两个读取操作相互干扰(这个问题同样存在于 Indy 10 的 TIdCmdTCPClient 组件中)。
要使用 TIdTelnet 发送传出命令,您必须使用其 SendCh() 方法单独发送每个字符(如果您升级到 Indy 10,TIdTelnet 有一个 SendString() 方法可以为您处理),然后等到OnDataAvailable 事件根据需要处理响应。
除非 TOR 实际上使用真正的 Telnet 协议(Telnet 序列和所有),那么最好使用 TIdTCPClient 而不是 TIdTelnet。 TIdTelnet 是特定于 Telnet 的客户端,而不是像 TIdTCPClient 那样的通用 TCP/IP 客户端。
【讨论】:
我的回答基于an example,展示了如何使用 Unix telnet 命令连接到 Tor。我的结论是 telnet 是适合这项工作的协议。 Telnet 客户端通常用于测试基于文本的协议,但主要是因为它在大多数操作系统安装中都很容易使用。然而,Telnet 是一个自成一体的协议,有自己的语义,而 Indy 的 TIdTelnet 实现就是为此而生,因此不能成为一个好的通用协议客户端。为此直接使用 TIdTCPClient,例如:Client.Connect; Client.SendCmd('AUTHENTICATE ...', 250); Client.SendCmd('signal NEWNYM', 250'); Client.Write('quit'); Client.Disconnect;
在 Indy 10.5.5 中仍然没有 SendString。
10.5.8 引入了TIdTelnet.SendString()
方法。以上是关于如何使用 TIdTelnet 发送命令?的主要内容,如果未能解决你的问题,请参考以下文章