我正在尝试从我的程序中模拟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或不知道如何发送该特定命令。
答案 0 :(得分:7)
您无法在TIdTelnet中使用SendCmd()方法。 TIdTelnet使用内部读取线程连续从套接字读取(因为Telnet是一种可以随时接收数据的异步协议)。 SendCmd()执行自己的内部读取以接收发送命令的响应。两个读取操作相互干扰(出于同样的原因,这个问题也存在于Indy 10的TIdCmdTCPClient组件中)。
要使用TIdTelnet发送传出命令,必须使用其SendCh()方法单独发送每个字符(如果升级到Indy 10,TIdTelnet有一个SendString()方法,则为您处理)然后等到OnDataAvailable事件,根据需要处理响应。
除非TOR实际上使用真正的Telnet协议(Telnet序列和所有),否则最好使用TIdTCPClient而不是TIdTelnet。 TIdTelnet是一个特定于Telnet的客户端,而不是像TIdTCPClient那样的通用TCP / IP客户端。