@@ -33,30 +33,19 @@ public static class PortUtilities
3333 /// <returns>A random, free port to be listened on.</returns>
3434 public static int FindFreePort ( )
3535 {
36- // Prefer IPv6 dual-mode when available , but fall back robustly to IPv4
36+ // Prefer IPv4 , but fall back robustly to IPv6
3737 try
3838 {
39- using var ipV6socket = new Socket ( AddressFamily . InterNetworkV6 , SocketType . Stream , ProtocolType . Tcp ) ;
40-
41- // Some platforms may not support DualMode or IPv6 at all; ignore failures and let bind decide
42- try
43- {
44- ipV6socket . DualMode = true ;
45- }
46- catch
47- {
48- // Ignored; we'll still attempt to bind to IPv6 loopback
49- }
50-
51- ipV6socket . Bind ( new IPEndPoint ( IPAddress . IPv6Loopback , 0 ) ) ;
52- return ( ( IPEndPoint ) ipV6socket . LocalEndPoint ! ) . Port ;
53- }
54- catch ( SocketException )
55- {
56- // If creating/binding the IPv6 socket fails for any reason, fall back to IPv4
5739 using var ipV4socket = new Socket ( AddressFamily . InterNetwork , SocketType . Stream , ProtocolType . Tcp ) ;
5840 ipV4socket . Bind ( new IPEndPoint ( IPAddress . Loopback , 0 ) ) ;
5941 return ( ( IPEndPoint ) ipV4socket . LocalEndPoint ! ) . Port ;
6042 }
43+ catch ( SocketException )
44+ {
45+ // If creating/binding the IPv4 socket fails for any reason, fall back to IPv6
46+ using var ipV6socket = new Socket ( AddressFamily . InterNetworkV6 , SocketType . Stream , ProtocolType . Tcp ) ;
47+ ipV6socket . Bind ( new IPEndPoint ( IPAddress . IPv6Loopback , 0 ) ) ;
48+ return ( ( IPEndPoint ) ipV6socket . LocalEndPoint ! ) . Port ;
49+ }
6150 }
6251}
0 commit comments