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