2010-10-21 10 views
3

J'essaye de simuler le bouton "nouvelle identité" dans Vidalia (l'interface graphique Tor) de mon programme. I asked about that, basée sur la réponse de Rob Kennedy, j'ai essayé dans ma demande:Comment utiliser TIdTelnet pour envoyer des commandes?

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

Mais il n'a pas fonctionné pour moi. Même après avoir envoyé la commande, j'ai le même proxy.

J'utilise Indy 9.

Je ne sais pas si je ne sais pas comment utiliser TIdTelnet ou ne savent pas comment envoyer cette commande spécifique.

Répondre

7

Vous ne pouvez pas utiliser la méthode SendCmd() avec TIdTelnet. TIdTelnet utilise un thread de lecture interne qui lit en continu à partir du socket (puisque Telnet est un protocole asynchrone qui peut recevoir des données à tout moment). SendCmd() effectue sa propre lecture interne pour recevoir la réponse de la commande envoyée. Les deux opérations de lecture interfèrent les unes avec les autres (ce problème existe également dans le composant TIdCmdTCPClient d'Indy 10 pour la même raison). Pour envoyer une commande sortante avec TIdTelnet, vous devez utiliser sa méthode SendCh() pour envoyer chaque caractère individuellement (si vous mettez à niveau vers Indy 10, TIdTelnet a une méthode SendString() qui gère cela pour vous), puis attendez jusqu'à ce que l'événement OnDataAvailable pour traiter la réponse selon les besoins.

À moins que TOR n'utilise réellement le vrai protocole Telnet (séquences Telnet et tout), il vaut mieux utiliser TIdTCPClient au lieu de TIdTelnet. TIdTelnet est un client spécifique à Telnet, pas un client TCP/IP à usage général comme TIdTCPClient.

+0

J'ai basé ma réponse sur [un exemple] (http://ubuntuforums.org/showthread.php?t=558051) montrant comment utiliser la commande Unix Telnet pour se connecter à Tor. J'ai conclu que telnet est le bon protocole pour le travail. –

+0

Un client telnet est souvent utilisé pour tester des protocoles basés sur du texte, mais principalement uniquement parce qu'il est facilement disponible dans la plupart des installations du système d'exploitation. Cependant, Telnet est un protocole qui lui est propre, avec sa propre sémantique, et l'implémentation de TIdTelnet par Indy joue sur cela, et ne fait donc pas un bon client de protocole polyvalent. Utilisez TIdTCPClient directement pour cela, par exemple: 'Client.Connect; Client.SendCmd ('AUTHENTICATE ...', 250); Client.SendCmd ('signal NEWNYM', 250 '); Client.Write ('quitter'); Client.Disconnect; ' –

+0

dans Indy 10.5.5 toujours là pas de SendString. –

Questions connexes