在开启服务的时候,需要检测端口有没有被占用,可借助本地计算机的网络连接的信息(IPGlobalProperties)
public class NetworkHelper
{
public static int Port => EnsureEstablishedPort(CandidatePorts);
/// <summary>
/// 获取可用的端口
/// </summary>
/// <param name="availablePorts"></param>
/// <returns></returns>
private static int EnsureEstablishedPort(IEnumerable<int> availablePorts)
{
foreach (int availablePort in availablePorts)
if (!CheckPortInUse(availablePort))
return availablePort;
return -1;
}
/// <summary>
/// 检测端口是否被占用
/// </summary>
/// <param name="port"></param>
/// <returns></returns>
private static bool CheckPortInUse(int port)
{
IPGlobalProperties iPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] activeTcpConnections = iPGlobalProperties.GetActiveTcpConnections();
foreach (TcpConnectionInformation tcpConnectionInformation in activeTcpConnections)
if (tcpConnectionInformation.LocalEndPoint.Port == port && (tcpConnectionInformation.State == TcpState.Established || tcpConnectionInformation.State == TcpState.CloseWait))
return true;
IPEndPoint[] activeTcpListeners = iPGlobalProperties.GetActiveTcpListeners();
if (activeTcpListeners.Length == 0) return false;
foreach (var t in activeTcpListeners)
if (t.Port == port)
return true;
return false;
}
//候选端口
private static readonly int[] CandidatePorts = new int[2] { 1234, 5678 };
}