【问题标题】:How do I use TIdTelnet to send commands?如何使用 TIdTelnet 发送命令?
【发布时间】: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 还是不知道如何发送该特定命令。

【问题讨论】:

    标签: delphi telnet indy


    【解决方案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() 方法。
    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2010-10-14
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多