Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.13;
Скачать: CL | DM;

Вниз

Автоматическая авторизация TelNet   Найти похожие ветки 

 
ZHK   (2003-08-14 09:13) [0]

Парни, чайнику нужна Ваша квалифицированная помощь! Тема следующая: Беру компонент TIdTelnet, подключаюсь к удаленному серверу по внутренней сетке. Пока все хорошо, но сервер защищен паролем, а программа должна автоматически соединяться и в автомате получать кучу информации. Причем периодически связь рвется, и соединение необходимо восстанавливать в кратчайшие сроки. Вот. Делаю следующее: соединяюсь, принимаю все подряд, пока не найду слово "login:", затем передаю логин, заранее известный. Далее жду "Password:", передаю пароль. Затем жду последовательность символов "swsh >". После него, вроде как, идут данные. Я их принимаю. Но иногда, а точнее после каждого реконнекта, часть данных теряется, иногда даже очень большая. Подскажите, что с этим можно сделать, дабы все работало корректно?


 
Reindeer Moss Eater ©   (2003-08-14 09:19) [1]

после каждого реконнекта, часть данных теряется, иногда даже очень большая

Как это удалось установить?


 
ZHK   (2003-08-14 09:56) [2]

Установить удалось очень просто. Данные текстовые, и как они выглядят я тоже знаю. Эти данные я качаю и сохраняю по разным логам.Есть лог, собственно, данных и есть лог системных, так сказать, сообщений. Так вот, информация, если признак полного коннекта вместе с именем пользователя и паролем не появился, сваливается в лог системных сообщений. Так вот, после прохождения суток, я обнаружил, что коннект, физически произошел, но моя программа это не определила, то есть "swsh >" не появился, или появился криво. И все данные сливались в системный лог. Это неприятно, так как эти данные потом обрабатываются далее в автомате и их пропуск очень нежелателан. Вот.


 
Reindeer Moss Eater ©   (2003-08-14 10:00) [3]

Три возможных причины отсутствия данных в логах:
1.не все данные принимаются клиентом
2.не все принятые данные пишутся в лог (обрабатываются клиентом)
3. неизвестная науке причина.


 
ZHK   (2003-08-14 10:02) [4]

Да нет, не в этом дело. я, в общем, хотел узнать, я правильно авторизацию-то делаю, или нет. Может есть более простой способ, чем буквы ловить?


 
Reindeer Moss Eater ©   (2003-08-14 10:09) [5]

я, в общем, хотел узнать, я правильно авторизацию-то делаю, или нет.

Так никто не видел как ты ее делаешь.


 
Телепат   (2003-08-14 10:12) [6]

да правильно вроде авторизацию делает...


 
ZHK   (2003-08-14 10:23) [7]

Примерно так:

procedure TForm1.DataRecieve(Buffer: String);
begin
Buffer:=#13+S+Buffer;
while Buffer<>"" do
begin
if SplitStr(Buffer,S) then
begin
if Echo then
Form4.AddData(ActiveServer,S);
S:="";
end;
LogEn:=Pos("LOGIN:",UpperCase(S))>0;
PassEn:=Pos("PASSWORD:",UpperCase(S))>0;
Connect:=Pos("SWSH >",UpperCase(S))>0;
end;
end;

function TForm1.Connection(ServerName:String; TN:TIdTelnet; Host:String; LOGIN:String; Password:String):Boolean;
var
I:Integer;
TNDA:TTnDataAvail;
RecStr:String;
procedure SendString(S:String);
begin
while S<>"" do
begin
TN.SendCh(S[1]);
Delete(S,1,1);
end;
end;
var
ADT:TDateTime;
begin
Echo:=True;
Result:=False;
RecStr:="";
LogEn:=False;
PassEn:=False;
Connect:=False;
S:="";
if MaxConn<1 then
Exit;
I:=0;
if TN.Connected then
TN.Disconnect;
TNDA:=TN.OnDataAvailable;
TN.OnDataAvailable:=DataRecieve;
TN.Host:=Host;
repeat
if TN.Connected then
TN.Disconnect;
ADT:=Date+Time;
repeat
Form4.ShowMessage(AllServers,ServerName +": Установление соединения. Попытка №"+IntToStr(I+1));
TN.Connect;
if not TN.Connected then
begin
Sleep(SleepNoConn);
I:=I+1;
end;
until (I>=MaxConn) or TN.Connected;
if TN.Connected then
begin
while not Connect and ((Date+Time-ADT)<=WaitToConn/86400) do
begin
Application.ProcessMessages;
if LogEn then
begin
Form4.ShowMessage(AllServers,ServerName+": Проверка пользователя.");
Form4.AddData(InterMSG,"Проверка пользователя.",True);
if Login="" then
if not Form3.Execute(Login,Password) then
begin
TN.Disconnect;
I:=MaxConn;
end;
if I<MaxConn then
SendString(Login+#13);
LogEn:=False;
end;
Form4 - обыкновенный монитор, отображающий информацию на экране, Echo - включает/выключает вывод.


 
Reindeer Moss Eater ©   (2003-08-14 10:35) [8]

Если очередной вызов SplitStr вернет False, то глобальные флаги LogEn,PassEn,Connect сохранят свои предыдущие значения.


 
ZHK   (2003-08-14 10:41) [9]

Ну да. SplitStr выделяет из Buffer строку по символу #13. Причем, если до конца буффера это значение не встретилось, возвращается False. Если же S содержит реально законченную строку, то тогда SplitStr - True.


 
Reindeer Moss Eater ©   (2003-08-14 10:43) [10]

Ну и ни о чем таком тебе это не говорит?


 
ZHK   (2003-08-14 10:43) [11]

Да, Form3 - форма для ввода логина и пароля, если в качестве одного/обоих параметров была передана пустая строка.


 
ZHK   (2003-08-14 10:45) [12]

Нет не говорит. В этом я, пожалуй, уверен. Хотя, Reindeer Moss Eater, если у тебя возникли по этому поводу сомнения, просвети меня, пожалуйста. Я чегой-то не врублюсь...


 
Reindeer Moss Eater ©   (2003-08-14 10:51) [13]

В одном месте программа ветвится на основании значений флагов.
В другом месте флагам присваиваются значения.
Есть случаи, когда всем флагам значения не поменяются. (данные пришли новые, а флаги остались старые)


 
ZHK   (2003-08-14 10:59) [14]

Reindeer Moss Eater, пожалуй, наоборот. Это сделано для того, чтобы отловить ключевые слова, так как они не заканчиваются символои #13. По другому не получается. То есть флаги могут измениться еще до того, как из сети придет строка полностью. Но ты мне лучше скажи, если ты действительно больший знаток в области соединения с серверами, чем я, правильно ли я В ПРИНЦИПЕ подошел к авторизации? Если сам алгоритм, что я изначально описал, верен, а ошибка только в коде, то ошибку я найду, я не настолько чайник, как представился. Просто данную проблему я решаю впервые. Если у тебя есть какие-то соображения по алгоритмам авторизапции и ты будешь настолько любезен, что вкратце изложишь основы подключения, то буду тебе очень признателен.


 
Reindeer Moss Eater ©   (2003-08-14 11:02) [15]

Ну отловил ты ключевое слово.
Выставил флаг в True.
Следом пришли данные без ограничителя.
Split вернул False и флаг остался в True.
А дальше на основании его значения TForm1.Connection делает неправильные выводы.


 
ZHK   (2003-08-14 11:08) [16]

Нет, ты не прав. Если посмотришь код, то увидишь, что флаг, после его обработки, сразу же обнуляется, то есть переводится в False. Этопроисходит в цикле в процедуре Connection:

if LogEn then
begin
Form4.ShowMessage(AllServers,ServerName+": Проверка пользователя.");
Form4.AddData(InterMSG,"Проверка пользователя.",True);
if Login="" then
if not Form3.Execute(Login,Password) then
begin
TN.Disconnect;
I:=MaxConn;
end;
if I<MaxConn then
SendString(Login+#13);
LogEn:=False;
end;


 
Reindeer Moss Eater ©   (2003-08-14 11:13) [17]

А где реакция на PassEn?


 
ZHK   (2003-08-14 11:14) [18]

A-A-A, Семен-Семеныч. Знаешь, Reindeer Moss Eater, ты хоть и заблуждался, но мыслил в правильном направлении! ВЕДЬ ЕСЛИ, ДОПУСТИМ, ПРИШЕЛ ЛОГИН, ФЛАГ УСТАНОВИЛСЯ, Я ЕГО НЕ ОБРАБОТАЛ,А В ЭТО ВРЕМЯ ПРИШЛИ ЕЩЕ ДАННЫЕ, ТО ЗНАЧЕНИЕ ФЛАГА ИЗМЕНИТСЯ!!! А не наоборот, случайно останется неизменным, как ты утверждал. Видишь и правда, один ум хорошо, а два - гораздо лучше :-) Спасибо тебе за дискуссию, в которой, пусть и в муках, но все же родилась правда. Сейчас попробую, если чего не пойдет - завтра опять лови меня здесь. :-)


 
ZHK   (2003-08-14 11:15) [19]

Да, а реакция на PassEn то же есть, просто толи с буфера не все вставилось, то ли я в буфер не все кинул по запарке.


 
ZHK   (2003-08-14 15:39) [20]

Может кто еще чего подскажет?


 
ZHK   (2003-08-15 10:28) [21]

Кстати, а информацию ловлю не всю. Почему знаю? Да просто япошки написали нечто подобное и так же как и я сохраняют сообщения. Сравнивал, у них больше, а мне надо в реалтиме все обрабатывать... :-(



Страницы: 1 вся ветка

Текущий архив: 2003.10.13;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.024 c
1-40474
terra
2003-10-02 14:11
2003.10.13
Работа с TImage


7-40713
Khloo!
2003-07-31 15:34
2003.10.13
TreeView


14-40675
Владислав
2003-09-18 12:57
2003.10.13
Нужна информация по СУБД.


6-40551
SM
2003-08-07 15:33
2003.10.13
Как избавиться от сообщения об ошибке при попытке коннекта сокета


1-40399
Igor Mish
2003-09-30 15:05
2003.10.13
ini файлы