Anton S. wrote:

> 1) In my descendant class I implement true asynchronous Connect with
> asynchronous DNS lookup before connecting. 

Method DnsLookup doesn't require a custom timeout since the underlaying
winsock function uses system's DNS lookup timeout. Same for Connect
with or without DNS name.
And if method Connect is called with a DNS name it performs a blocking
DNS lookup while a Built-In timeout won't trigger at all. 

> Of course, I wish to use
> built-in timeout mechanism for tracking timeouts. But descendant
> classes haven't access to necessary fields, namely
> FTimeoutConnectStartTick. And without it I have no means of
> controlling the timeout.
> There are two ways as I see it: make
> FTimeoutConnectStartTick protected or even public - like Counter
> field is - or add a parameter to TimeoutStartSampling with type
> TTimeoutReason. Inside this method when parameter is torConnect,
> FTimeoutConnectStartTick would be assigned. Or, async DNS lookup
> before connect could be implemented in TWSocket what is the best
> decision IMHO :)

I don't see it. Why do you need FTimeoutConnectStartTick? 

You can do what ever you like i.e. (from memory): 

MyWSocket1.TimeoutConnect := 0;
MyWSocket1.TimeoutIdle := 15000;
MyWSocket1.InDnsLookup := TRUE;

procedure TForm1.MyWSocket1DnsLookupDone(Sender: TObject;
  ErrCode: Word);
  MyWSocket1.InDnsLookup := FALSE; 
  if ErrCode = 0 then 
      MyWSocket1.Addr           := MyWSocket1.DnsResult; //IP
      MyWSocket1.TimeoutIdle    := 0;
      MyWSocket1.TimeoutConnect := 30000;        

procedure TForm1.MyWSocket1Timeout(Sender: TObject; Reason: TTimeoutReason);
  if MyWSocket1.InDnsLookup then
  else if Reason = torConnect then

Or simply use TimeoutIdle only and handle the timeout according
to whatsoever state you like. You may also call TimeoutStartSampling
from the timeout event handler.
> 2) I have listening socket and wish to have its clients disconnected
> by inactivity timeout. Alas, the sockets created by Accept are never
> ininialized with timeout code. 

Listening sockets do not connect so use TimeoutIdle in OnClientCreate

procedure TTcpSrvForm.WSocketServer1ClientCreate(Sender: TObject;
  Client: TWSocketClient);
    Client.TimeoutSampling := 5000;
    Client.TimeoutIdle     := 30000;
    Client.OnTimeout       := ClientTimeout;

procedure TTcpSrvForm.ClientTimeout(Sender: TObject; Reason: TTimeoutReason);
    if TWSocketClient(Sender).State = wsConnected then

Or call TimeoutStartSampling explicitly from OnClientConnect.
> 3) I have a TTimer in my thread which owns sockets. May I use
> TIcsThreadTimer instead and would it be more effective or no
> difference?  

TIcsThreadTimer is a lazy, low resolution timer, so in general no 
TTimer replacement, use TIcsTimer if you need a thread-safe TTimer
replacement. TIcsTimer doesn't create a hidden window but uses 
TWSocket's window to receive WM_TIMER messages, that saves
one window handle.

There are example apps. for both ICS timers in folder MiscDemos. 
Arno Garrels

> --
> Anton
To unsubscribe or change your settings for TWSocket mailing list
please goto
Visit our website at

Reply via email to