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