C# 獲取一個可用的TCP埠號
阿新 • • 發佈:2021-06-22
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(); } } }