2010-10-21 93 views
3

我想從我的程序中模擬Vidalia中的「新身份」按鈕(Tor GUI)。 I asked about that的基礎上,羅伯肯尼迪的回答,我在我的應用程序嘗試這樣做:如何使用TIdTelnet發送命令?

IdTelnet1.Host:='127.0.0.1'; 
IdTelnet1.Port:=9051; 
IdTelnet1.Connect(-1); 
IdTelnet1.SendCmd('SIGNAL NEWNYM'); 

但它並沒有爲我工作。即使在我發送命令後,我也會得到相同的代理。

我使用印9.

我不知道我是否不知道如何使用TIdTelnet或不知道如何發送特定的命令。

回答

7

您不能將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客戶端。

+0

我根據我的回答[示例](http://ubuntuforums.org/showthread.php?t=558051)顯示如何使用Unix telnet命令連接到Tor。我認爲telnet是這份工作的正確協議。 – 2010-10-22 00:59:27

+0

Telnet客戶端通常用於測試基於文本的協議,但主要只是因爲它在大多數操作系統安裝中都可用。然而,Telnet是一個獨立的協議,具有它自己的語義,而Indy的TIdTelnet的實現起到了這個作用,因此不會成爲一個好的通用協議客戶端。直接使用TIdTCPClient,例如:'Client.Connect; Client.SendCmd('AUTHENTICATE ...',250); Client.SendCmd('signal NEWNYM',250'); Client.Write( '退出'); Client.Disconnect; Indy 10.5.5中的 – 2010-10-22 20:25:29

+0

仍然沒有SendString。 – 2011-06-18 15:31:04