服务之:端口占用

在开启服务的时候,需要检测端口有没有被占用,可借助本地计算机的网络连接的信息(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 };
    }

 

posted on 2023-06-02 15:41  TanZhiWei  阅读(21)  评论(0编辑  收藏  举报