Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.02 c
1-1193671998
avoid
2007-10-29 18:33
2008.02.03
Как узнать, по какой колонке был клик в TListView?


2-1199875558
DevilDevil
2008-01-09 13:45
2008.02.03
Правильные Panel-и на ControlBar-е


15-1198495044
@!!ex
2007-12-24 14:17
2008.02.03
Проблема зрения..


15-1198658013
user_
2007-12-26 11:33
2008.02.03
Tray


8-1173018362
Quelle
2007-03-04 17:26
2008.02.03
Градиент