不以物喜,不以己悲

C# 获取一个可用的TCP端口号

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();
        }
    }
}
posted @ 2021-06-22 14:16  这种人  阅读(1094)  评论(0编辑  收藏  举报