Browse Source

* Pass exact size to connect

Michaël Van Canneyt 2 weeks ago
parent
commit
6c705e1280
1 changed files with 26 additions and 5 deletions
  1. 26 5
      packages/fcl-net/src/fpsockets.pp

+ 26 - 5
packages/fcl-net/src/fpsockets.pp

@@ -222,10 +222,10 @@ function ConnectionState(const ASocket: TFPSocket): TConnectionState;
 type
 type
   PAddressUnion = ^TAddressUnion;
   PAddressUnion = ^TAddressUnion;
   TAddressUnion = record
   TAddressUnion = record
-   case TFPSocketType of
-  stIPv4: (In4Addr: sockaddr_in);
-  stIPv6: (In6Addr: sockaddr_in6);
-  stUnixSocket: (UnixAddr: sockaddr_un);
+  case TFPSocketType of
+    stIPv4: (In4Addr: sockaddr_in);
+    stIPv6: (In6Addr: sockaddr_in6);
+    stUnixSocket: (UnixAddr: sockaddr_un);
   end;
   end;
 
 
 function SocketInvalid(ASocket: TSocket): Boolean; inline;
 function SocketInvalid(ASocket: TSocket): Boolean; inline;
@@ -588,6 +588,9 @@ function Connect(const ASocket: TFPSocket; const AAddress: TNetworkAddress;
   APort: Word): TConnectionState;
   APort: Word): TConnectionState;
 var
 var
   addr: TAddressUnion;
   addr: TAddressUnion;
+  addrlen : cint;
+  addrptr : socketsunit.psockaddr;
+
 const
 const
   {$IFDEF WINDOWS} 
   {$IFDEF WINDOWS} 
   EALREADY = WSAEALREADY;
   EALREADY = WSAEALREADY;
@@ -614,7 +617,25 @@ const
   {$ENDIF}
   {$ENDIF}
 begin
 begin
   addr := CreateAddr(AAddress, APort, ASocket.SocketType = stIPDualStack);
   addr := CreateAddr(AAddress, APort, ASocket.SocketType = stIPDualStack);
-  if fpconnect(ASocket.FD, socketsunit.psockaddr(@addr), SizeOf(addr)) <> 0 then
+  case ASocket.SocketType of
+    stIPv4,
+    stIPDualStack:
+      begin
+      addrlen:=sizeof(sockaddr_in);
+      addrptr:=psockaddr(@addr.In4Addr);
+      end;
+    stIPv6 :
+      begin
+      addrlen:=sizeof(sockaddr_in6);
+      addrptr:=psockaddr(@addr.In6Addr);
+      end;
+    stUnixSocket :
+      begin
+      addrlen:=sizeof(sockaddr_un);
+      addrptr:=psockaddr(@addr.UnixAddr);
+      end;
+  end;
+  if fpconnect(ASocket.FD, addrptr, addrlen) <> 0 then
     case socketerror of
     case socketerror of
     EALREADY,
     EALREADY,
     EINPROGRESS,
     EINPROGRESS,