Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.10.13;
Скачать: [xml.tar.bz2];

Вниз

Автоматическая авторизация 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.01 c
1-40504
Erik
2003-10-03 10:58
2003.10.13
Недебажится компонент.


1-40429
Tumcoat
2003-10-03 04:14
2003.10.13
Как сделать прокрутку формы колесиком?


1-40395
denis24
2003-10-01 09:43
2003.10.13
размер шрифта в ячейке stringgrida


14-40649
VictorT
2003-09-25 14:15
2003.10.13
Интересует ваше мнение по поводу...


4-40730
Onyx
2003-08-08 13:08
2003.10.13
КОНТЕКСТНОЕ МЕНЮ!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский