| 
| 
 | Вопрос # 5 947/ вопрос открыт / | 
 |  Всем добрый день......уже который день не могу решить проблемы с Telnet-ом
 
 проблема в том что - после подключения к конкретному Host-у надо вводить логин и пароль...
 если использовать библиотеку Synapse то в нем есть возможность дождаться запроса на Логи и пароль...
 WaitFor( \'login:\' )
 
 Можно ли как обойтись без этой Библиотеки...?
 
|  |   Вопрос задал: Electronic_Arts (статус: Посетитель)Вопрос отправлен: 12 февраля 2012, 19:50
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: DNK Здравствуйте, Electronic_Arts!Как-то нужно было решить подобную проблему, я тогда кроме Indy ничего не знал. Постарался сделать выдержку из тех исходников.
 Приложение:Переключить в обычный режим type  TKDLoadForm = class(TForm)...    EditAddr: TEdit;    EditUser: TEdit;    EditPass: TEdit;    IdTelnet: TIdTelnet;    TimerWait: TTimer;...    procedure TimerWaitTimer(Sender: TObject);    procedure IdTelnetDataAvailable(Sender: TIdTelnet;      const Buffer: String);...  private    { Private declarations }    TelnetBuf: string;...    function WaitString(const aStr: string): string;    procedure SendCmd(const cmd: string);    procedure Login;    procedure Logout;...  end; ... const  READY = '[/] #'; procedure TKDLoadForm.TimerWaitTimer(Sender: TObject);begin  IdTelnet.Disconnect;end; procedure TKDLoadForm.IdTelnetDataAvailable(Sender: TIdTelnet;  const Buffer: String);begin  TelnetBuf := TelnetBuf + Buffer;end; procedure TKDLoadForm.Login;var saveEnable: boolean;begin  TelnetBuf := '';  IdTelnet.Host := EditAddr.Text;  try     IdTelnet.Connect;  except    end;  if IdTelnet.Connected then begin    WaitString('Login:');    SendCmd(EditUser.Text);    WaitString('Password:');    SendCmd(EditPass.Text);    WaitString(READY);  end;end; procedure TKDLoadForm.Logout;begin  if IdTelnet.Connected then IdTelnet.Disconnect;end; procedure TKDLoadForm.SendCmd(const cmd: string);var i: integer;begin  if not IdTelnet.Connected then    exit;  for i := 1 to Length(cmd) do    IdTelnet.SendCh(cmd[i]);  IdTelnet.SendCh(#13);end; 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; 
|  | Ответ отправил: DNK (статус: Студент)Время отправки: 13 февраля 2012, 14:22
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 8; последнее сообщение — 19 февраля 2012, 18:15; участников в обсуждении: 3. 
|   | Вадим К (статус: Академик), 13 февраля 2012, 11:55 [#1]:А чем не удовлетворяет библиотека? Или просто хочется написать самостоятельно? тогда просто можно посмотреть в сорцы - библиотека то открытая. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Electronic_Arts (статус: Посетитель), 13 февраля 2012, 14:44 [#2]:Проблема библиотеки геморой - потому что когда появляется новая версия Delphi то надо ждать когда же выпустят новый компонент...и вообще если все это делает сама программа зачем мучить себя компонентом - но я согласен что с компонентами легче гораздо легче и быстрее...но все же лишних знаний не бывает... 
 DNK - спасибо попробую отпишусь...
 |  
|   | Вадим К (статус: Академик), 14 февраля 2012, 12:55 [#3]: Цитата (Electronic_Arts): Проблема библиотеки геморой - потому что когда появляется новая версия Delphi то надо ждать когда же выпустят новый компонент... вообще то нужно было только для юникода библиотеку поправить. Но не всякая библиотека - это компонент.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | 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 (статус: Студент), 18 февраля 2012, 19:32 [#5]:Telnet-сервер может зависнуть или ответить что-то другое, в этом случае программа будет ожидать ответа бесконечно долго, т.е. тоже зависнет. В этом случае таймер через разумный промежуток времени, разорвет соединение. "Digital Networked Knight" |  
|   | Electronic_Arts (статус: Посетитель), 18 февраля 2012, 22:14 [#6]:А как увидеть то что ответил телнет? - ну в смысле может у него там не просто Login написано а что то другое |  
|   | Electronic_Arts (статус: Посетитель), 18 февраля 2012, 22:15 [#7]:А как следить за тем что делает программа?? - в принципе для этого я добавить в форму компонент Memo а так оно мне не там нужно - после того как программа заработает я его уберу оттуда |  
|   | DNK (статус: Студент), 19 февраля 2012, 18:15 [#8]:То что приходит видно в IdTelnetDataAvailable, то что уходит - в SendCmd. "Digital Networked Knight" |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |