![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка EIdClosedSocket (Indy) при завершении соединения [D7, WinXP]
Tor © (2007-05-22 18:27:00)Всем пис!
Люди добрые, подскажите как избавиться от назойлевой ошибки 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;
А может появление этой ошибки из дебагера вполне нормальное явление? :)
umbra (2007-05-23 10:40:00) [1]
> DM.SendCommand(TClient(Items[I]).ClientThread, Command,
> ''); // Отправка комманды клиенту, например на перезагрузку
> или выключение
если в результате этого клиенты сами закрывают соединение, то при
> DM.TCPServer.Active := false;
сервер пытается читать из соединения и, естественно, возникает ошибка. Вообще, неправильно, когда сервер отправляет команды клиенту. Он должен на них только отвечать.
DVM (2007-05-23 10:30:00) [2]
> Это не есть выход из положения.
Выход ты уже придумал try...except
А то что дебаггер реагирует на исключения - можно отклюяить как тебе написали.
DVM (2007-05-23 10:29:00) [3]
> чего выскакивает эта ошибка.
Это не ошибка, это исключение. Исключения <> ошибки.
Сергей М. (2007-05-23 10:25:00) [4]А что его искать ?
Ошибка возникает не иначе как при выполнении read- или write-метода объекта Connection.
Tor (2007-05-23 10:07:00) [5]Это не есть выход из положения. Хотелось бы найти место где происходит чтение или запись в буфер соединения в результате чего выскакивает эта ошибка.
Сергей М. (2007-05-23 08:24:00) [6]Tools -> Debugger Options .. -> Language exceptions
Stop on Delphi Exceptions = False