C# 获取一个可用的TCP端口号
第一种方式:
public static int GetAvailablePort(IPAddress ip)
{
TcpListener listener = new TcpListener(ip, 0);
listener.Start();
int port = ((IPEndPoint)listener.LocalEndpoint).Port;
listener.Stop();
return port;
}
第二种方式:
public static class FreePort
{
private const string PortReleaseGuid = "CE068CFE-E3C6-4A72-B19A-E2743E2B08C6";
/// <summary>
/// 寻找空闲的端口号
/// </summary>
/// <param name="startPort">开始寻找的起始端口号</param>
/// <returns>空闲的端口号</returns>
public static int FindNextAvailableTCPPort(int startPort)
{
int port = startPort;
bool isAvailable = true;
var mutex = new Mutex(false,
string.Concat("Global/", PortReleaseGuid));
mutex.WaitOne();
try
{
IPGlobalProperties ipGlobalProperties =
IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] endPoints =
ipGlobalProperties.GetActiveTcpListeners();
do
{
if (!isAvailable)
{
port++;
isAvailable = true;
}
foreach (IPEndPoint endPoint in endPoints)
{
if (endPoint.Port != port) continue;
isAvailable = false;
break;
}
} while (!isAvailable && port < IPEndPoint.MaxPort);
if (!isAvailable)
throw new ApplicationException("Not able to find a free TCP port.");
return port;
}
finally
{
mutex.ReleaseMutex();
}
}
/// <summary>
/// 寻找空闲的udp端口号
/// </summary>
/// <param name="startPort">开始寻找的起始端口号</param>
/// <returns>空闲的端口号</returns>
public static int FindNextAvailableUDPPort(int startPort)
{
int port = startPort;
bool isAvailable = true;
var mutex = new Mutex(false,
string.Concat("Global/", PortReleaseGuid));
mutex.WaitOne();
try
{
IPGlobalProperties ipGlobalProperties =
IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] endPoints =
ipGlobalProperties.GetActiveUdpListeners();
do
{
if (!isAvailable)
{
port++;
isAvailable = true;
}
foreach (IPEndPoint endPoint in endPoints)
{
if (endPoint.Port != port)
continue;
isAvailable = false;
break;
}
} while (!isAvailable && port < IPEndPoint.MaxPort);
if (!isAvailable)
throw new ApplicationException("Not able to find a free TCP port.");
return port;
}
finally
{
mutex.ReleaseMutex();
}
}
}