|
Вопрос # 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"
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|