Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 947

/ вопрос открыт /

Всем добрый день...
...уже который день не могу решить проблемы с Telnet-ом

проблема в том что - после подключения к конкретному Host-у надо вводить логин и пароль...
если использовать библиотеку Synapse то в нем есть возможность дождаться запроса на Логи и пароль...
WaitFor( \'login:\' )

Можно ли как обойтись без этой Библиотеки...?

Electronic_Arts Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Electronic_Arts (статус: Посетитель)
Вопрос отправлен: 12 февраля 2012, 19:50
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: DNK

Здравствуйте, Electronic_Arts!
Как-то нужно было решить подобную проблему, я тогда кроме Indy ничего не знал. Постарался сделать выдержку из тех исходников.

Приложение:
  1. type
  2. TKDLoadForm = class(TForm)
  3. ...
  4. EditAddr: TEdit;
  5. EditUser: TEdit;
  6. EditPass: TEdit;
  7. IdTelnet: TIdTelnet;
  8. TimerWait: TTimer;
  9. ...
  10. procedure TimerWaitTimer(Sender: TObject);
  11. procedure IdTelnetDataAvailable(Sender: TIdTelnet;
  12. const Buffer: String);
  13. ...
  14. private
  15. { Private declarations }
  16. TelnetBuf: string;
  17. ...
  18. function WaitString(const aStr: string): string;
  19. procedure SendCmd(const cmd: string);
  20. procedure Login;
  21. procedure Logout;
  22. ...
  23. end;
  24.  
  25. ...
  26.  
  27. const
  28. READY = '[/] #';
  29.  
  30. procedure TKDLoadForm.TimerWaitTimer(Sender: TObject);
  31. begin
  32. IdTelnet.Disconnect;
  33. end;
  34.  
  35. procedure TKDLoadForm.IdTelnetDataAvailable(Sender: TIdTelnet;
  36. const Buffer: String);
  37. begin
  38. TelnetBuf := TelnetBuf + Buffer;
  39. end;
  40.  
  41. procedure TKDLoadForm.Login;
  42. var saveEnable: boolean;
  43. begin
  44. TelnetBuf := '';
  45. IdTelnet.Host := EditAddr.Text;
  46. try
  47. IdTelnet.Connect;
  48. except
  49.  
  50. end;
  51. if IdTelnet.Connected then begin
  52. WaitString('Login:');
  53. SendCmd(EditUser.Text);
  54. WaitString('Password:');
  55. SendCmd(EditPass.Text);
  56. WaitString(READY);
  57. end;
  58. end;
  59.  
  60. procedure TKDLoadForm.Logout;
  61. begin
  62. if IdTelnet.Connected then IdTelnet.Disconnect;
  63. end;
  64.  
  65. procedure TKDLoadForm.SendCmd(const cmd: string);
  66. var i: integer;
  67. begin
  68. if not IdTelnet.Connected then
  69. exit;
  70. for i := 1 to Length(cmd) do
  71. IdTelnet.SendCh(cmd[i]);
  72. IdTelnet.SendCh(#13);
  73. end;
  74.  
  75. function TKDLoadForm.WaitString(const aStr: string): string;
  76. var p: integer;
  77. begin
  78. TimerWait.Enabled := true;
  79. try
  80. repeat
  81. Application.ProcessMessages;
  82. sleep(100);
  83. p := pos(aStr, TelnetBuf);
  84. until not IdTelnet.Connected or (p > 0);
  85. if p > 0 then begin
  86. Result := copy(TelnetBuf, 1, p + length(aStr));
  87. Delete(TelnetBuf, 1, p + length(aStr));
  88. end else
  89. Result := '';
  90. finally
  91. TimerWait.Enabled := false;
  92. end;
  93. end;
  94.  


Ответ отправил: DNK (статус: Студент)
Время отправки: 13 февраля 2012, 14:22
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 19 февраля 2012, 18:15; участников в обсуждении: 3.
Вадим К

Вадим К (статус: Академик), 13 февраля 2012, 11:55 [#1]:

А чем не удовлетворяет библиотека? Или просто хочется написать самостоятельно? тогда просто можно посмотреть в сорцы - библиотека то открытая.
Галочка "подтверждения прочтения" - вселенское зло.
Electronic_Arts

Electronic_Arts (статус: Посетитель), 13 февраля 2012, 14:44 [#2]:

Проблема библиотеки геморой - потому что когда появляется новая версия Delphi то надо ждать когда же выпустят новый компонент...и вообще если все это делает сама программа зачем мучить себя компонентом - но я согласен что с компонентами легче гораздо легче и быстрее...но все же лишних знаний не бывает...

DNK - спасибо попробую отпишусь...
Вадим К

Вадим К (статус: Академик), 14 февраля 2012, 12:55 [#3]:

Цитата (Electronic_Arts):

Проблема библиотеки геморой - потому что когда появляется новая версия Delphi то надо ждать когда же выпустят новый компонент...

вообще то нужно было только для юникода библиотеку поправить. Но не всякая библиотека - это компонент.
Галочка "подтверждения прочтения" - вселенское зло.
Electronic_Arts

Electronic_Arts (статус: Посетитель), 18 февраля 2012, 17:29 [#4]:

DNK - у меня вопрос насчет этой функции..
function TKDLoadForm.WaitString(const aStr: string): string;
var p: integer;
begin
TimerWait.Enabled := true;   
try                          
repeat                       
Application.ProcessMessages;
sleep(100);
p := pos(aStr, TelnetBuf);
until not IdTelnet.Connected or (p > 0);
if p > 0 then begin
Result := copy(TelnetBuf, 1, p + length(aStr));
Delete(TelnetBuf, 1, p + length(aStr));
end else
Result := '';
finally
TimerWait.Enabled := false;
end;
end;

TimerWait.Enabled := true; //ПОЧЕМУ ТУТ отключаем Телнет?


Вадим К - насчет Synapse - почему то код не пашет - помоги разобраться в чем проблема
добавил в форму memo чтоб следить где оно останавливается
var
TTelnet: TTelnetSend;
begin
TTelnet:=TTelnetSend.Create;
TTelnet.Timeout:=5000;
TTelnet.TargetHost:='192.168.1.1';
TTelnet.Login;
if TTelnet.Login then
begin
memo1.Clear;
memo1.Lines.Add('Connected');
if (TTelnet.WaitFor( 'Login:' )) then
begin
TTelnet.Send( CONST_USER + #13 );
memo1.Lines.Add('LOGIN: ADMIN');
if (TTelnet.WaitFor( 'Password:' )) then
begin
TTelnet.Send( CONST_PWD + #13 );
memo1.Lines.Add('PASWD: ADMIN');
if ( TTelnet.WaitFor( '#' )) or ( TTelnet.WaitFor( '>' )) then
begin
TTelnet.Logout;
memo1.Lines.Add('DISCONNECTED!');
end;
..
..
после подключения в memo вижу Connected и все дальше не идет..почему?
DNK

DNK (статус: Студент), 18 февраля 2012, 19:32 [#5]:

Telnet-сервер может зависнуть или ответить что-то другое, в этом случае программа будет ожидать ответа бесконечно долго, т.е. тоже зависнет. В этом случае таймер через разумный промежуток времени, разорвет соединение.
"Digital Networked Knight"
Electronic_Arts

Electronic_Arts (статус: Посетитель), 18 февраля 2012, 22:14 [#6]:

А как увидеть то что ответил телнет? - ну в смысле может у него там не просто Login написано а что то другое
Electronic_Arts

Electronic_Arts (статус: Посетитель), 18 февраля 2012, 22:15 [#7]:

А как следить за тем что делает программа?? - в принципе для этого я добавить в форму компонент Memo а так оно мне не там нужно - после того как программа заработает я его уберу оттуда
DNK

DNK (статус: Студент), 19 февраля 2012, 18:15 [#8]:

То что приходит видно в IdTelnetDataAvailable, то что уходит - в SendCmd.
"Digital Networked Knight"

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.04 сек.