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

Вниз

Виснет при TidServerSocket.Active:=false; Инди 10   Найти похожие ветки 

 
Kacnep ©   (2006-03-22 16:31) [0]

Доброе время суток всем!
Уважаемые мастера, не скажете в чем может быть трабл.
После прекращения Трида выполняется код основной программы


procedure Tf_Main.CS_Done(Sender: TObject);
begin
//  !!!!!!!!!!!!!!!!!!!!!!!!!!!! Трид долго закрывается но закрывается (сек 30 примерно в потоке)
 if Assigned(CSCl) then begin
   AddLog("***** CS ***** : Nil(CSCl);",LogF);
   CSCl:=nil;
   sb_Main.Panels[4].Text:="CSThread закрыта! Закрываю Server...";
   Application.ProcessMessages;

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! То что ниже вообще не выполняется - так и не дождался закрытия!!!!!!!!
   if id_Srv.Active then id_Srv.Active:=false;

   sb_Main.Panels[4].Text:="Server Закрыт!";

   if not id_Srv.Active then begin
     bb_Start_Srv.Enabled:=true;
     gb_Srv.Enabled:=true;
     sb_Main.Panels[3].Text:="Читеров: 0";
     sb_Main.Panels[4].Text:="Сокет закрыт.";
   end
 end;//if
end;


Что происходит????? Если клиент ТСП активен то закрыть его! Даже при 0 подключений к нему - все! Висяк!

Вопрос 2 Как Все подключеным клиентам отправить Закрытие сокета.

Спасибо!


 
Сергей М. ©   (2006-03-22 16:54) [1]


> Даже при 0 подключений к нему - все!


Сомневаюсь.

При >0 - да, ситуация действительно возможна из-за неверной логики, реализованной , скажем, в OnExecute


 
Eraser ©   (2006-03-22 16:58) [2]


> Kacnep ©   (22.03.06 16:31)

кем вызывается procedure Tf_Main.CS_Done(Sender: TObject); ?


 
Kacnep ©   (2006-03-22 17:23) [3]

2 Eraser
Я эту процедуру повесил на завершение потока.
Поток начинает работу с такими параметрами
 FreeOnTerminate := True;
 i_uc:=TIdUDPClient.Create(nil);
 i_uc.ReceiveTimeout:=2000;
 i_uc.Host:=FSRV;
 i_uc.Port:=FPort;
Это на всяк пожарн... в потоке УДП клиент работает с КС сервером.
Когда я ему приказываю завершиться - он нормально завершается ()в логах все последовательно видно-даже понял почему долго -30 сек.)
 И как только он завершается вызывается CS_Done.

2 Сергей М.
ОнЭкзекуте - приходит "Byte Строка"
byte - всегда равен 2 - по логам смотрю...
А строка это как комманда Выход,Чистый,Читер
Все...
тут не должно быть место ошибке...

procedure Tf_Main.id_SrvExecute(AContext: TIdContext);
var
 s:string;
 n:integer;
begin
 s:=AContext.Connection.IOHandler.ReadLn;
 Addlog(AContext.Connection.Socket.Binding.PeerIP+" - "+s,Logf);
 case strtoint(s[1]) of
   1 : begin //clear
//      if copy(s,3,length(s)-2)="Quit..." then
 //      Addlog(AContext.Connection.Socket.Binding.PeerIP+" прислал QUIT из-за версии.",Logf);
   end;//2
   2 : begin
     n:=GetPos(AContext.Connection.Socket.Binding.PeerIP);
     if copy(s,3,length(s)-2)="Clear." then begin
       Addlog(AContext.Connection.Socket.Binding.PeerIP+" - "+s,Logf);
       if n<0 then lb_Users.Items.AddObject(AContext.Connection.Socket.Binding.PeerIP+" OK",Pointer(1))
       else begin
         lb_Users.Items.Strings[n]:=AContext.Connection.Socket.Binding.PeerIP+" OK";
         lb_Users.Items.Objects[n]:=Pointer(1);
       end;//else
     end
     else
       if copy(s,3,length(s)-2)="Quit" then begin
         Addlog(AContext.Connection.Socket.Binding.PeerIP+" прислал QUIT. Отключается.",Logf);
         if n>=0 then lb_Users.Items.Delete(n);
         AContext.Connection.Socket.CloseGracefully;
       end
       else begin
         Addlog(AContext.Connection.Socket.Binding.PeerIP+" - "+s,Logf);
         if n<0 then lb_Users.Items.AddObject(AContext.Connection.Socket.Binding.PeerIP+" Чит",Pointer(2))
         else  begin
           lb_Users.Items.Strings[n]:=AContext.Connection.Socket.Binding.PeerIP+" Чит";
           lb_Users.Items.Objects[n]:=Pointer(2);
         end;//else
       end;
   end;//2
 end;//case
end;


 
Kacnep ©   (2006-03-22 17:26) [4]

И еще Мастера подскажите тупню как в инди реализовать что то типа такой инструкции.

For i:=0 to TCPServer.Conections.count do
 TCPServer.Conections[i].socket.close;


на всякий пожарный хочу перед закрытием сервера порвать все подключения


 
Kacnep ©   (2006-03-23 09:03) [5]

Ув. Мастера
сервер реально зависает на такой фразе id_Srv.Active:=false;
Может ли кто нить подсказать как отключить все подключения?
А уж потом попытаюсь сделать Деактивацию сервера.
Спасибо


 
Сергей М. ©   (2006-03-23 09:51) [6]


> Kacnep ©   (23.03.06 09:03) [5]


Сервер у тебя зависает из-за того что не может дождаться завершения как минимум одного из созданных им кодовых потоков. А поток этот тем временем занят бесконечным ожиданием данных в вызванной им ф-ции ReadLn().

Установи для сервера св-во ReceiveTimeout порядка секунды-двух, тогда ф-ция по истечению тайм-аута будет возвращать управление, после чего следует тут же проверить св-во Terminated потока, и если оно установлено - немедленно закругляться.


 
Kacnep ©   (2006-03-23 10:06) [7]

2 Сергей
Я почти уверен что ты прав!
Ибо когда клиентов нет сервак гаситься моментом!
Но у  id_Srv: TIdTCPServer; - нет свойства ReceiveTimeout :(
И где проверять завершился ли поток?
Я так понимаю  в методе id_SrvExecute?
А что нить похожее на Пример у Вас можно спросить?


 
Kacnep ©   (2006-03-23 10:11) [8]

Сергей можно ли связаться с Вами по аське?
Если можно - 70015922.


 
Сергей М. ©   (2006-03-23 10:17) [9]


> у  id_Srv: TIdTCPServer; - нет свойства ReceiveTimeout


Ну пусть не ReceiveTimeout ..

Пусть это будет TIdTCPConnection.ReadTimeout (в Indy9, в 10-ке - не знаю) - какая разница ? Можно было бы и самому уж догадаться, что речь идет о некоем св-ве, задающем тайм-аут ..


> где проверять завершился ли поток?
> Я так понимаю  в методе id_SrvExecute?


Да.

А по поводу "примеров" - они есть в составе Indy Demo Projects


 
Kacnep ©   (2006-03-23 12:39) [10]

Сергей можно ли связаться с Вами по аське?
Если можно - 70015922.



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

Форум: "Сети";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.011 c
11-1131187277
MTsv DN
2005-11-05 13:41
2006.08.06
KOLnMCK v.2.21


2-1153411217
Ivolg
2006-07-20 20:00
2006.08.06
Сообщение


15-1152350701
так себе
2006-07-08 13:25
2006.08.06
Склонение фамилий, имен и отчеств


2-1153136297
webpauk
2006-07-17 15:38
2006.08.06
InputBox


9-1131923007
Ricks
2005-11-14 02:03
2006.08.06
Огонь





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский