Текущий архив: 2008.02.03;
Скачать: CL | DM;
ВнизОшибка EIdClosedSocket (Indy) при завершении соединения Найти похожие ветки
← →
Tor © (2007-05-22 18:27) [0]Всем пис!
Люди добрые, подскажите как избавиться от назойлевой ошибки EIdClosedSocket которая вылетает после того как я выключаю TCP сервер. Причем ошибка появляется только если запущена прога из под делфи.
Вот пример кода завершения соединения:
...
if Command <> 0 then
begin
FClose := true; // Флаг что прога может быть завершена
with DM.ClientList do
begin
for I := 0 to Count - 1 do
if not (TClient(Items[I]).State in [csPayment, csService]) then
begin
DM.SendCommand(TClient(Items[I]).ClientThread, Command, ""); // Отправка комманды клиенту, например на перезагрузку или выключение
end;
end;
DM.TCPServer.Active := false; // после этой строки и выскакивает EIdClosedSocket
CanClose := true;
end;
А вот событие OnExecute, возможно именно сдесь вылетает этот эрор:
procedure TDM.TCPServerExecute(AThread: TIdPeerThread);
var
Client: TClient;
ReciveBlock: TReciveBlock;
Readed: Boolean;
begin
if FClose then Exit;
Readed := false;
Client := ClientByIP(AThread.Connection.Socket.Binding.PeerIP);
if (not AThread.Terminated) and (AThread.Connection.Connected) and (Assigned(Client)) then
try
// AThread.Connection.CheckForDisconnect(true, true);
AThread.Connection.ReadBuffer(ReciveBlock, SizeOf(ReciveBlock));
Readed := true;
except
on EIdReadTimeout do ;
on EIdClosedSocket do ;
on EIdException do
begin
AThread.Connection.Disconnect;
Client.Refresh(csDisconnect);
end;
end;
if Readed then
begin
Client.IncTraffic := ReciveBlock.IncTraffic;
Client.OutTraffic := ReciveBlock.OutTraffic;
end;
end;
А может появление этой ошибки из дебагера вполне нормальное явление? :)
← →
Сергей М. © (2007-05-23 08:24) [1]Tools -> Debugger Options .. -> Language exceptions
Stop on Delphi Exceptions = False
← →
Tor © (2007-05-23 10:07) [2]Это не есть выход из положения. Хотелось бы найти место где происходит чтение или запись в буфер соединения в результате чего выскакивает эта ошибка.
← →
Сергей М. © (2007-05-23 10:25) [3]А что его искать ?
Ошибка возникает не иначе как при выполнении read- или write-метода объекта Connection.
← →
DVM © (2007-05-23 10:29) [4]
> чего выскакивает эта ошибка.
Это не ошибка, это исключение. Исключения <> ошибки.
← →
DVM © (2007-05-23 10:30) [5]
> Это не есть выход из положения.
Выход ты уже придумал try...except
А то что дебаггер реагирует на исключения - можно отклюяить как тебе написали.
← →
umbra © (2007-05-23 10:40) [6]
> DM.SendCommand(TClient(Items[I]).ClientThread, Command,
> ""); // Отправка комманды клиенту, например на перезагрузку
> или выключение
если в результате этого клиенты сами закрывают соединение, то при
> DM.TCPServer.Active := false;
сервер пытается читать из соединения и, естественно, возникает ошибка. Вообще, неправильно, когда сервер отправляет команды клиенту. Он должен на них только отвечать.
Страницы: 1 вся ветка
Текущий архив: 2008.02.03;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.043 c