Bläddra i källkod

* Fixed wrongly initialized maxconnections and refactor to allow message-loop style handling

git-svn-id: trunk@17464 -
michael 14 år sedan
förälder
incheckning
075b26b833
1 ändrade filer med 40 tillägg och 22 borttagningar
  1. 40 22
      packages/fcl-net/src/ssockets.pp

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

@@ -44,6 +44,7 @@ type
   Private
     FSocketInitialized : Boolean;
     FSocketOptions : TSocketOptions;
+    FLastError : integer;
     Procedure GetSockOptions;
     Procedure SetSocketOptions(Value : TSocketOptions);
     function GetLocalAddress: TSockAddr;
@@ -58,6 +59,7 @@ type
                                             Write SetSocketOptions;
     property LocalAddress: TSockAddr read GetLocalAddress;
     property RemoteAddress: TSockAddr read GetRemoteAddress;
+    Property LastError : Integer Read FLastError;
   end;
 
   TConnectEvent = Procedure (Sender : TObject; Data : TSocketStream) Of Object;
@@ -86,6 +88,7 @@ type
     Function  Accept: Longint;Virtual;Abstract;
     Function  SockToStream (ASocket : Longint) : TSocketStream;Virtual;Abstract;
     Procedure Close; Virtual;
+    function GetConnection: TSocketStream;
   Public
     Constructor Create(ASocket : Longint);
     Destructor Destroy; Override;
@@ -149,6 +152,7 @@ type
   Public
     Constructor Create(ASocket : longint); Override; Overload;
     Constructor Create(const AHost: String; APort: Word); Overload;
+    Destructor destroy; override;
     Property Host : String Read FHost;
     Property Port : Word Read FPort;
   end;
@@ -255,6 +259,10 @@ Var
 begin
   Flags:=0;
   Result:=fprecv(handle,@Buffer,count,flags);
+  If Result<0 then
+    FLastError:=SocketError
+  else
+    FLastError:=0;
 end;
 
 Function TSocketStream.Write (Const Buffer; Count : Longint) :Longint;
@@ -265,6 +273,10 @@ Var
 begin
   Flags:=0;
   Result:=fpsend(handle,@Buffer,count,flags);
+  If Result<0 then
+    FLastError:=SocketError
+  else
+    FlastError:=0;
 end;
 
 function TSocketStream.GetLocalAddress: TSockAddr;
@@ -295,12 +307,14 @@ Constructor TSocketServer.Create(ASocket : Longint);
 begin
   FSocket:=ASocket;
   FQueueSize :=5;
+  FMaxConnections:=-1;
 end;
 
 Destructor TSocketServer.Destroy;
 
 begin
   Close;
+  Inherited;
 end;
 
 Procedure TSocketServer.Close;
@@ -324,11 +338,27 @@ begin
     Raise ESocketError.Create(seListenFailed,[FSocket,SocketError]);
 end;
 
+Function TSocketServer.GetConnection : TSocketStream;
+
+var
+  NewSocket : longint;
+
+begin
+  Result:=Nil;
+  NewSocket:=Accept;
+  If NewSocket>=0 then
+    begin
+    If FAccepting and DoConnectQuery(NewSocket) Then
+      Result:=SockToStream(NewSocket)
+    else
+      CloseSocket(NewSocket);
+    end
+end;
+
 Procedure TSocketServer.StartAccepting;
 
 Var
- NoConnections,
- NewSocket : longint;
+ NoConnections : Integer;
  Stream : TSocketStream;
 
 begin
@@ -338,34 +368,22 @@ begin
   Repeat
     Repeat
       Try
-        NewSocket:=Accept;
-        If NewSocket>=0 then
+        Stream:=GetConnection;
+        if Assigned(Stream) then
           begin
           Inc (NoConnections);
-          If FAccepting and DoConnectQuery(NewSocket) Then
-            begin
-            Stream:=SockToStream(NewSocket);
-            DoConnect(Stream);
-            end
-          else
-            begin
-            CloseSocket(NewSocket);
-            NewSocket:=-1;
-            end;          
-          end
+          DoConnect(Stream);
+          end;
       except
         On E : ESocketError do
-        begin
+          begin
           If E.Code=seAcceptWouldBlock then
-            begin
-            DoOnIdle;
-            NewSocket:=-1;
-            end
+            DoOnIdle
           else
             Raise;
-        end;
+          end;
        end;
-    Until (NewSocket>=0) or (Not NonBlocking);
+    Until (Stream<>Nil) or (Not NonBlocking);
   Until Not (FAccepting) or ((FMaxConnections<>-1) and (NoConnections>=FMaxConnections));
 end;