2
0
Эх сурвалжийг харах

* Fix default class for server-side socket connection streams

Michaël Van Canneyt 1 долоо хоног өмнө
parent
commit
c1aa60198d

+ 22 - 22
packages/fcl-net/src/ssockets.pp

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