using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Net.Sockets; namespace FastGithub.Configuration { /// /// 提供本机设备信息 /// public static class LocalMachine { /// /// 获取可用的随机Tcp端口 /// /// /// 最小值 /// public static int GetAvailableTcpPort(AddressFamily addressFamily, int min = 1025) { var hashSet = new HashSet(); var tcpListeners = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners(); foreach (var item in tcpListeners) { if (item.AddressFamily == addressFamily) { hashSet.Add(item.Port); } } for (var port = min; port < ushort.MaxValue; port++) { if (hashSet.Contains(port) == false) { return port; } } throw new FastGithubException("当前无可用的端口"); } /// /// 获取可用的随机端口 /// /// /// 最小值 /// public static int GetAvailablePort(AddressFamily addressFamily, int min = 1025) { var hashSet = new HashSet(); var tcpListeners = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners(); var udpListeners = IPGlobalProperties.GetIPGlobalProperties().GetActiveUdpListeners(); foreach (var item in tcpListeners) { if (item.AddressFamily == addressFamily) { hashSet.Add(item.Port); } } foreach (var item in udpListeners) { if (item.AddressFamily == addressFamily) { hashSet.Add(item.Port); } } for (var port = min; port < ushort.MaxValue; port++) { if (hashSet.Contains(port) == false) { return port; } } throw new FastGithubException("当前无可用的端口"); } /// /// 是否可以监听指定tcp端口 /// /// /// public static bool CanListenTcp(int port) { var tcpListeners = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners(); return tcpListeners.Any(item => item.Port == port) == false; } } }