1
0

blcksock.pas - Added TBlockSocket.ConnectionTimeout

git-svn-id: https://svn.code.sf.net/p/synalist/code/trunk@160 7c85be65-684b-0410-a082-b2ed4fbef004
This commit is contained in:
geby 2012-06-14 11:13:05 +00:00
parent faf75a79d3
commit 7723c48a4d

@ -1,5 +1,5 @@
{==============================================================================|
| Project : Ararat Synapse | 009.008.005 |
| Project : Ararat Synapse | 009.009.000 |
|==============================================================================|
| Content: Library base |
|==============================================================================|
@ -314,6 +314,7 @@ type
FStopFlag: Boolean;
FNonblockSendTimeout: Integer;
FHeartbeatRate: integer;
FConnectionTimeout: integer;
{$IFNDEF ONCEWINSOCK}
FWsaDataOnce: TWSADATA;
{$ENDIF}
@ -831,6 +832,10 @@ type
{:Timeout for data sending by non-blocking socket mode.}
property NonblockSendTimeout: Integer read FNonblockSendTimeout Write FNonblockSendTimeout;
{:Timeout for @link(Connect) call. Default value 0 means default system timeout.
Non-zero value means timeout in millisecond.}
property ConnectionTimeout: Integer read FConnectionTimeout write FConnectionTimeout;
{:This event is called by various reasons. It is good for monitoring socket,
create gauges for data transfers, etc.}
property OnStatus: THookSocketStatus read FOnStatus write FOnStatus;
@ -1547,6 +1552,7 @@ begin
FStopFlag := False;
FNonblockSendTimeout := 15000;
FHeartbeatRate := 0;
FConnectionTimeout := 0;
FOwner := nil;
{$IFNDEF ONCEWINSOCK}
if Stub = '' then
@ -1914,13 +1920,26 @@ end;
procedure TBlockSocket.Connect(IP, Port: string);
var
Sin: TVarSin;
b: boolean;
begin
SetSin(Sin, IP, Port);
if FLastError = 0 then
begin
if FSocket = INVALID_SOCKET then
InternalCreateSocket(Sin);
SockCheck(synsock.Connect(FSocket, Sin));
if FConnectionTimeout > 0 then
begin
// connect in non-blocking mode
b := NonBlockMode;
NonBlockMode := true;
SockCheck(synsock.Connect(FSocket, Sin));
if (FLastError = WSAEINPROGRESS) OR (FLastError = WSAEWOULDBLOCK) then
if not CanWrite(FConnectionTimeout) then
FLastError := WSAETIMEDOUT;
NonBlockMode := b;
end
else
SockCheck(synsock.Connect(FSocket, Sin));
if FLastError = 0 then
GetSins;
FBuffer := '';