public static class NetworkHelpers
{
+ static Random rndPort = new Random ();
+
public static int FindFreePort ()
{
- TcpListener l = new TcpListener(IPAddress.Loopback, 0);
- l.Start();
- int port = ((IPEndPoint)l.LocalEndpoint).Port;
- l.Stop();
- return port;
+ return LocalEphemeralEndPoint ().Port;
}
+
public static IPEndPoint LocalEphemeralEndPoint ()
{
- return new IPEndPoint (IPAddress.Loopback, FindFreePort());
+ while (true) {
+ var ep = new IPEndPoint (IPAddress.Loopback, rndPort.Next (10000, 60000));
+ var socket = new Socket (ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
+
+ try {
+ socket.Bind (ep);
+ socket.Close ();
+ return ep;
+ } catch (SocketException) { }
+ }
}
}
}