Как я могу использовать TIdTelnet для отправки команд? - PullRequest
3 голосов
/ 22 октября 2010

Я пытаюсь смоделировать кнопку "новая личность" в Vidalia ( Tor GUI) из моей программы. Я спросил об этом , основываясь на ответе Роба Кеннеди, я попробовал это в своем приложении:

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

Но у меня это не сработало. Даже после отправки команды я получаю тот же прокси.

Я использую Indy 9.

Я не знаю, не знаю, как использовать TIdTelnet или не знаю, как отправить эту конкретную команду.

1 Ответ

7 голосов
/ 22 октября 2010

Вы не можете использовать метод SendCmd () с TIdTelnet.TIdTelnet использует внутренний поток чтения, который непрерывно читает данные из сокета (поскольку Telnet - это асинхронный протокол, который может принимать данные в любое время).SendCmd () выполняет собственное внутреннее чтение, чтобы получить ответ отправленной команды.Две операции чтения мешают друг другу (эта проблема также существует в компоненте TIdCmdTCPClient в Indy 10 по той же причине).

Чтобы отправить исходящую команду с помощью TIdTelnet, необходимо использовать метод SendCh () для отправки каждого символаиндивидуально (если вы обновитесь до Indy 10, в TIdTelnet есть метод SendString (), который обрабатывает это для вас), а затем подождите, пока событие OnDataAvailable не обработает ответ по мере необходимости.

Если TOR фактически не использует настоящий Telnetпротокол (последовательности Telnet и все), тогда вам лучше использовать TIdTCPClient вместо TIdTelnet.TIdTelnet - это специфичный для Telnet клиент, а не универсальный TCP / IP-клиент, такой как TIdTCPClient.

...