@@ -144,8 +144,13 @@ private static IPAddress ParseSockAddr(ReadOnlySpan<byte> buffer)
144144 return null ;
145145 }
146146
147- // First two bytes are address family (little-endian on most platforms)
148- var family = ( AddressFamily ) BitConverter . ToInt16 ( buffer ) ;
147+ // macOS/BSD: sockaddr has sin_len (1 byte) + sin_family (1 byte)
148+ // Linux: sockaddr has sa_family (2 bytes)
149+ var isBsd = RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ||
150+ RuntimeInformation . IsOSPlatform ( OSPlatform . FreeBSD ) ;
151+ var family = isBsd
152+ ? ( AddressFamily ) buffer [ 1 ] // BSD: family is second byte
153+ : ( AddressFamily ) BitConverter . ToInt16 ( buffer ) ; // Linux: family is first 2 bytes
149154
150155 if ( family == AddressFamily . InterNetwork && buffer . Length >= 8 )
151156 {
@@ -169,9 +174,15 @@ private static IPEndPoint ParseSockAddrEndPoint(ReadOnlySpan<byte> buffer)
169174 return null ;
170175 }
171176
172- // First two bytes are address family (little-endian on most platforms)
173- var family = ( AddressFamily ) BitConverter . ToInt16 ( buffer ) ;
174- // Port is in network byte order (big-endian)
177+ // macOS/BSD: sockaddr has sin_len (1 byte) + sin_family (1 byte)
178+ // Linux: sockaddr has sa_family (2 bytes)
179+ var isBsd = RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) ||
180+ RuntimeInformation . IsOSPlatform ( OSPlatform . FreeBSD ) ;
181+ var family = isBsd
182+ ? ( AddressFamily ) buffer [ 1 ] // BSD: family is second byte
183+ : ( AddressFamily ) BitConverter . ToInt16 ( buffer ) ; // Linux: family is first 2 bytes
184+
185+ // Port is in network byte order (big-endian), at offset 2 on both platforms
175186 var port = ( buffer [ 2 ] << 8 ) | buffer [ 3 ] ;
176187
177188 if ( family == AddressFamily . InterNetwork && buffer . Length >= 8 )
0 commit comments