Lukas Skala wrote:
> hello,
> I have server application based on TWSocketServer, clients are derived
> from TWSocketClient class.
> I need disconnect inactive clients. I'm not sure how to disconnect
> client, I'm using this:
> 
> procedure DisconnectMyClient(i: Integer);
> var
>   C: TTcpSrvClient;
>   {TTcpSrvClient = class(TWSocketClient)}
> begin
> C := Server.Client[I] as TTcpSrvClient;
> C.Close;

That works, though "Server.Client[I].Close" would be enough.

If want to close clients while iterating over the client list
make sure you iterate from high index down to zero like:
 
for I := Server.ClientCount -1 downto 0 do
  Server.Client[I].Close;

A more brutal method to enforce client close was
Server.Disconnect().

> C.Free; {Is this correct? sometimes it will throw access violation
> here....} end;

That's wrong, don't do that. Client objects are freed and 
removed from the internal client list when they are closed
or disconnected automatically by the server.

> 
> 
> I'm using ICS v6.

You should update to ICSv7.

> 
> I did notice that Server.OnClientDisconnect event is not triggered
> when client is not closed correctly (e.g. client is plugged of
> ethernet). 

That's the expected behaviour. 

> Is there any possibility to detect and/or disconnect these
> clients automatically?

Implement an idle timeout at the server side. Let the client send
some keep alive data in intervals so the server knows a client is
still there.   

-- 
Arno Garrels
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be

Reply via email to