|
@@ -52,6 +52,7 @@ type
|
|
TAcceptErrorAction = (aeaRaise,aeaIgnore,aeaStop);
|
|
TAcceptErrorAction = (aeaRaise,aeaIgnore,aeaStop);
|
|
TSocketStream = Class;
|
|
TSocketStream = Class;
|
|
TSocketServer = Class;
|
|
TSocketServer = Class;
|
|
|
|
+ TServerSocketStream = class;
|
|
TInetSocket = Class;
|
|
TInetSocket = Class;
|
|
{$IFDEF UNIX}
|
|
{$IFDEF UNIX}
|
|
TUnixSocket = class;
|
|
TUnixSocket = class;
|
|
@@ -59,6 +60,7 @@ type
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
TSocketStreamClass = Class of TSocketStream;
|
|
TSocketStreamClass = Class of TSocketStream;
|
|
TInetSocketClass = Class of TInetSocket;
|
|
TInetSocketClass = Class of TInetSocket;
|
|
|
|
+ TServerSocketStreamClass = Class of TServerSocketStream;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -252,7 +254,7 @@ type
|
|
Function Accept : Longint;override;
|
|
Function Accept : Longint;override;
|
|
Property Addr : TINetSockAddr Read FAddr;
|
|
Property Addr : TINetSockAddr Read FAddr;
|
|
Public
|
|
Public
|
|
- DefaultInetSocketClass : TInetSocketClass;
|
|
|
|
|
|
+ DefaultServerSocketClass : TServerSocketStreamClass;
|
|
Public
|
|
Public
|
|
Procedure Bind; Override;
|
|
Procedure Bind; Override;
|
|
Constructor Create(APort: Word);
|
|
Constructor Create(APort: Word);
|
|
@@ -288,9 +290,19 @@ type
|
|
TBlockingModes = Set of TBlockingMode;
|
|
TBlockingModes = Set of TBlockingMode;
|
|
TCheckTimeoutResult = (ctrTimeout,ctrError,ctrOK);
|
|
TCheckTimeoutResult = (ctrTimeout,ctrError,ctrOK);
|
|
|
|
|
|
- { TServerSocketStream }
|
|
|
|
|
|
+ {$if defined(unix) or defined(windows)}
|
|
|
|
+ {$DEFINE HAVENONBLOCKING}
|
|
|
|
+ {$endif}
|
|
|
|
+
|
|
|
|
+ TNonBlockingSocketStream = class(TSocketStream)
|
|
|
|
+ {$IFDEF HAVENONBLOCKING}
|
|
|
|
+ function SetSocketBlockingMode(ASocket: cint; ABlockMode: TBlockingMode; AFDSPtr: Pointer): boolean; virtual;
|
|
|
|
+ function CheckSocketConnectTimeout(ASocket: cint; AFDSPtr: Pointer; ATimeVPtr: Pointer): TCheckTimeoutResult; virtual;
|
|
|
|
+ {$ENDIF}
|
|
|
|
+ end;
|
|
|
|
|
|
- TServerSocketStream = class(TSocketStream)
|
|
|
|
|
|
+ { TServerSocketStream }
|
|
|
|
+ TServerSocketStream = class(TNonBlockingSocketStream)
|
|
Protected
|
|
Protected
|
|
FServer : TSocketServer;
|
|
FServer : TSocketServer;
|
|
Protected
|
|
Protected
|
|
@@ -300,18 +312,10 @@ type
|
|
Function CanRead(TimeOut : Integer): Boolean; override;
|
|
Function CanRead(TimeOut : Integer): Boolean; override;
|
|
end;
|
|
end;
|
|
|
|
|
|
-{$if defined(unix) or defined(windows)}
|
|
|
|
-{$DEFINE HAVENONBLOCKING}
|
|
|
|
-{$endif}
|
|
|
|
- TInetSocket = Class(TSocketStream)
|
|
|
|
|
|
+ TInetSocket = Class(TNonBlockingSocketStream)
|
|
Private
|
|
Private
|
|
FHost : String;
|
|
FHost : String;
|
|
FPort : Word;
|
|
FPort : Word;
|
|
- Protected
|
|
|
|
-{$IFDEF HAVENONBLOCKING}
|
|
|
|
- function SetSocketBlockingMode(ASocket: cint; ABlockMode: TBlockingMode; AFDSPtr: Pointer): boolean; virtual;
|
|
|
|
- function CheckSocketConnectTimeout(ASocket: cint; AFDSPtr: Pointer; ATimeVPtr: Pointer): TCheckTimeoutResult; virtual;
|
|
|
|
-{$ENDIF}
|
|
|
|
Public
|
|
Public
|
|
Constructor Create(const AHost: String; APort: Word; AHandler : TSocketHandler = Nil); Overload;
|
|
Constructor Create(const AHost: String; APort: Word; AHandler : TSocketHandler = Nil); Overload;
|
|
Constructor Create(const AHost: String; APort: Word; aConnectTimeout : Integer; AHandler : TSocketHandler = Nil); Overload;
|
|
Constructor Create(const AHost: String; APort: Word; aConnectTimeout : Integer; AHandler : TSocketHandler = Nil); Overload;
|
|
@@ -322,7 +326,7 @@ type
|
|
|
|
|
|
{$ifdef Unix}
|
|
{$ifdef Unix}
|
|
|
|
|
|
- TUnixSocket = Class(TSocketStream)
|
|
|
|
|
|
+ TUnixSocket = Class(TNonBlockingSocketStream)
|
|
Private
|
|
Private
|
|
FFileName : String;
|
|
FFileName : String;
|
|
Protected
|
|
Protected
|
|
@@ -1279,7 +1283,7 @@ function TInetServer.SockToStream(ASocket: Longint): TSocketStream;
|
|
Var
|
|
Var
|
|
H : TSocketHandler;
|
|
H : TSocketHandler;
|
|
ok : Boolean;
|
|
ok : Boolean;
|
|
- aClass : TInetSocketClass;
|
|
|
|
|
|
+ aClass : TServerSocketStreamClass;
|
|
|
|
|
|
procedure ShutDownH;
|
|
procedure ShutDownH;
|
|
begin
|
|
begin
|
|
@@ -1289,15 +1293,11 @@ Var
|
|
|
|
|
|
begin
|
|
begin
|
|
H:=GetClientSocketHandler(aSocket);
|
|
H:=GetClientSocketHandler(aSocket);
|
|
- aClass:=DefaultInetSocketClass;
|
|
|
|
-
|
|
|
|
- // Should be: Result:=TServerSocketStream.Create(ASocket,H);
|
|
|
|
|
|
+ aClass:=DefaultServerSocketClass;
|
|
|
|
|
|
if aClass=Nil then
|
|
if aClass=Nil then
|
|
- aClass:=TInetSocket;
|
|
|
|
|
|
+ aClass:=TServerSocketStream;
|
|
Result:=aClass.Create(ASocket,H);
|
|
Result:=aClass.Create(ASocket,H);
|
|
- (Result as TInetSocket).FHost:='';
|
|
|
|
- (Result as TInetSocket).FPort:=FPort;
|
|
|
|
|
|
|
|
ok:=false;
|
|
ok:=false;
|
|
try
|
|
try
|
|
@@ -1442,7 +1442,7 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
{$IFDEF HAVENONBLOCKING}
|
|
{$IFDEF HAVENONBLOCKING}
|
|
-function TInetSocket.SetSocketBlockingMode(ASocket: cint; ABlockMode: TBlockingMode; AFDSPtr: Pointer): Boolean;
|
|
|
|
|
|
+function TNonBlockingSocketStream.SetSocketBlockingMode(ASocket: cint; ABlockMode: TBlockingMode; AFDSPtr: Pointer): Boolean;
|
|
|
|
|
|
Const
|
|
Const
|
|
BlockingModes : Array[TBlockingMode] of DWord =
|
|
BlockingModes : Array[TBlockingMode] of DWord =
|
|
@@ -1483,7 +1483,7 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
// Return true if a timeout happened. Will only be called in case of eWouldBlock.
|
|
// Return true if a timeout happened. Will only be called in case of eWouldBlock.
|
|
-function TInetSocket.CheckSocketConnectTimeout(ASocket: cint; AFDSPtr: Pointer; ATimeVPtr: Pointer): TCheckTimeoutResult;
|
|
|
|
|
|
+function TNonBlockingSocketStream.CheckSocketConnectTimeout(ASocket: cint; AFDSPtr: Pointer; ATimeVPtr: Pointer): TCheckTimeoutResult;
|
|
|
|
|
|
var
|
|
var
|
|
Err,ErrLen : Longint;
|
|
Err,ErrLen : Longint;
|