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;
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.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
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.
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