Главная страница
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.023 c
2-1200206885
Anion
2008-01-13 09:48
2008.02.03
Проблема запуска Delphi 6


2-1199588278
Артем
2008-01-06 05:57
2008.02.03
IStorage и WebBrowser


6-1172017429
Ш-К
2007-02-21 03:23
2008.02.03
Свои "контролы" в TWebBrowser.


15-1199134770
Kerk
2007-12-31 23:59
2008.02.03
Фигня какая-то с раскладкой


15-1198671913
vajo
2007-12-26 15:25
2008.02.03
Win Vista Busines нормально работатет со SCSI дисками?