Skip to content

Commit 934d13a

Browse files
authored
[dotnet] Fix find port for IPv4 only environments (#16216)
1 parent d808465 commit 934d13a

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

dotnet/src/webdriver/Internal/PortUtilities.cs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,23 @@ public static class PortUtilities
3030
/// <summary>
3131
/// Finds a random, free port to be listened on.
3232
/// </summary>
33+
/// <remarks>
34+
/// Prefers IPv4, but falls back to IPv6 if necessary.
35+
/// </remarks>
3336
/// <returns>A random, free port to be listened on.</returns>
3437
public static int FindFreePort()
3538
{
36-
using var socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
37-
socket.DualMode = true;
38-
socket.Bind(new IPEndPoint(IPAddress.IPv6Loopback, 0));
39-
return (socket.LocalEndPoint as IPEndPoint)!.Port;
40-
39+
try
40+
{
41+
using var ipV4socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
42+
ipV4socket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
43+
return ((IPEndPoint)ipV4socket.LocalEndPoint!).Port;
44+
}
45+
catch (SocketException)
46+
{
47+
using var ipV6socket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
48+
ipV6socket.Bind(new IPEndPoint(IPAddress.IPv6Loopback, 0));
49+
return ((IPEndPoint)ipV6socket.LocalEndPoint!).Port;
50+
}
4151
}
4252
}

0 commit comments

Comments
 (0)