mirror of
https://github.com/logos-storage/logos-storage-nim-cs-dist-tests.git
synced 2026-01-02 13:33:07 +00:00
44 lines
1.1 KiB
C#
44 lines
1.1 KiB
C#
using System.Net.NetworkInformation;
|
|
|
|
namespace CodexPlugin
|
|
{
|
|
public class FreePortFinder
|
|
{
|
|
private readonly object _lock = new object();
|
|
private int nextPort = 8080;
|
|
|
|
public int GetNextFreePort()
|
|
{
|
|
lock (_lock)
|
|
{
|
|
return Next();
|
|
}
|
|
}
|
|
|
|
private int Next()
|
|
{
|
|
while (true)
|
|
{
|
|
var p = nextPort;
|
|
nextPort++;
|
|
|
|
if (!IsInUse(p))
|
|
{
|
|
return p;
|
|
}
|
|
|
|
if (nextPort > 30000) throw new Exception("Running out of ports.");
|
|
}
|
|
}
|
|
|
|
private bool IsInUse(int port)
|
|
{
|
|
var ipProps = IPGlobalProperties.GetIPGlobalProperties();
|
|
if (ipProps.GetActiveTcpConnections().Any(t => t.LocalEndPoint.Port == port)) return true;
|
|
if (ipProps.GetActiveTcpListeners().Any(t => t.Port == port)) return true;
|
|
if (ipProps.GetActiveUdpListeners().Any(u => u.Port == port)) return true;
|
|
return false;
|
|
}
|
|
}
|
|
}
|