Нужен пример / демонстрация использования TIdTelnet для взаимодействия с сервером telnet - PullRequest
4 голосов
/ 18 июня 2011

Я пытался использовать Indy 10.5.5 (поставляется с Delphi 2010) для:

  • подключение к серверу telnet
  • выполнение аутентификации по имени пользователя / паролю (получение доступа к командной оболочке)
  • выполнение команды с возвратом полученных данных обратно в приложение

и не увенчались успехом, кроме того, я полностью погружен в логику спагетти внутренних органов Инди и теперь не знаю, почему это не сработало или как я должен был отправлять строки на сервер и получать результаты. Нужен пример кода для изучения.


Формальная форма вопроса: где я могу получить демонстрацию, предоставленную сторонней организацией, охватывающую компонент TIdTelnet? (у демонстрационной веб-страницы indyproject.org ее нет)

Ответы [ 2 ]

5 голосов
/ 20 июня 2011

Основная проблема с Telnet заключается в том, что он НЕ использует модель команда / ответ, как большинство других интернет-протоколов.Любая сторона может отправлять данные в любое время, и каждое направление данных не зависит от другого направления.Это отражено в TIdTelnet тем фактом, что он запускает внутренний поток чтения для получения данных.Из-за этого вы не можете просто подключиться, отправить команду и ждать ответа в одном блоке кода, как вы можете с другими компонентами Indy.Вы должны написать команду, затем подождать, пока не сработает событие OnDataAvailable, и затем проанализировать данные, чтобы определить, что это на самом деле (и быть готовым к обработке ситуаций, в которых могут быть получены частичные данные, поскольку именно так TCP /IP работает).

Если вы подключаетесь к серверу, который фактически реализует модель команд / ответов, то лучше использовать TIdTCPClient напрямую вместо TIdTelnet (а затем реализовать любое декодирование последовательности Telnet вручнуюесли сервер действительно использует Telnet, что в наши дни редко, но не невозможно).Для Indy 11 мы могли бы реорганизовать логику TIdTelnet для поддержки не поточной версии, но это еще не решено.

3 голосов
/ 20 января 2012

сделано с инди.без комментариев .. просто какой-то старый код :-) telnet не нравится команда отправки строки .. используйте sendch.

telnetdude.Host := 1.1.1.1;
try
telnetdude.connect;
except
on E: Exception do begin
E.CleanupInstance;
end; {except}
if telnetdude.Connected then begin
for i := 1 to length(StringToSend) do telnetdude.sendch(StringToSend[i]);
telnetdude.sendch(#13);
end;
end; {while}
end; {if}
if telnetdude.Connected then telnetdude.Disconnect;
end;
...