Конференция "Сети" » Как правильно отключить клиентов (indy10)
 
  • salik © (18.02.11 21:41) [0]
    Доброго времени суток коллеги.
    Есть сервер (IdcmdTcpServer), к которому подключаются клиенты по Telnet. Подключения и отлючения проходят без ошибок, фиксируются в логах - все замечательно.
    В определенный момент возникает необходимость отключить клиентов (я делаю это кнопкой в событии OnClick).

    procedure TForm2.Button2Click(Sender: TObject);
    var
     List : TList;
     I: Integer;
    begin
     List := Srv.Contexts.LockList;
     try
       for i := 0 to List.Count-1 do
       with TIdContext(Srv.Contexts.LockList.Items[I]).Connection do
       Disconnect;
     finally
       Srv.Contexts.UnlockList;
     end;
    end;CODE>

    Клиенты отлючаются, но вот в чем подвох - сервер виснет при отключении

    procedure TForm2.Button3Click(Sender: TObject);
    begin
     Srv.Active := False;
    end;



    PS: DelphiXE Indy10.5.7
  • salik © (19.02.11 21:44) [1]
    Проблема оказалась в конфликте компонентов IdcmdTcpServer и IdServerInterceptLogEvent.
    Во время отлючения какой-то поток или ресурс был не освобожден и при выключении сервера они не могли самостоятельно завершиться.
    После удаления компонента IdServerInterceptLogEvent сервер завершает свою работу без проблем.

    Код отключения
    procedure TForm2.Button2Click(Sender: TObject);
    var
     I: Integer;
    begin
     try
       with Srv.Contexts.LockList do for I := 0 to Count-1 do
       TIdContext(Items[I]).Connection.Disconnect;
     finally
       Srv.Contexts.UnlockList;
     end;
    end;

  • имя (17.03.11 02:48) [2]
    Удалено модератором
 
Конференция "Сети" » Как правильно отключить клиентов (indy10)
Есть новые Нет новых   [134436   +24][b:0][p:0.001]