Форум: "Сети";
Текущий архив: 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