无法启动WCF服务,因为获取的端口已在使用中

时间:2019-07-17 05:50:39

标签: c# wpf

我试图获取一个免费的TCP端口并将其分配给WCF服务以启动我的应用程序。但是我获取的TCP端口有时很忙,这导致应用程序崩溃。

我尝试使用
来获取TCP端口    IPGlobalProperties.GetIPGlobalProperties()并使用以下代码将其分配给服务。

private static int FindTCPPort( int startPort = 0)
{
int begin = 49152;
int end = 65535;

IPGlobalProperties properties = 
IPGlobalProperties.GetIPGlobalProperties();
IPEndPoint[] tcpEndPoints = properties.GetActiveTcpListeners();

List<int> usedPorts = tcpEndPoints.Select(p => p.Port).ToList<int>();
int unusedPort = 0;

for (int port = begin; port < end; port++)
{
   if (!usedPorts.Contains(port))
   {
     unusedPort = port;
     break;
   }
}
return unusedPort;
}

是否有任何点网内部类将获得免费端口,或者即使我从IPGlobalProperties获得了免费端口,是否有一种方法可以检查同时分配的端口是否变为繁忙状态。

1 个答案:

答案 0 :(得分:0)

您可以使用此代码从给定的端口号开始获取第一个可用端口。 它使用IPGlobalProperties进行访问

public static int GetAvailablePort(int startingPort)
        {
            IPEndPoint[] endPoints;
            List<int> portArray = new List<int>();

            IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties();

            //getting active connections
            TcpConnectionInformation[] connections = properties.GetActiveTcpConnections();
            portArray.AddRange(from n in connections
                               where n.LocalEndPoint.Port >= startingPort
                               select n.LocalEndPoint.Port);

            //getting active tcp listners - WCF service listening in tcp
            endPoints = properties.GetActiveTcpListeners();
            portArray.AddRange(from n in endPoints
                               where n.Port >= startingPort
                               select n.Port);

            //getting active udp listeners
            endPoints = properties.GetActiveUdpListeners();
            portArray.AddRange(from n in endPoints
                               where n.Port >= startingPort
                               select n.Port);

            portArray.Sort();

            for (int i = startingPort; i < UInt16.MaxValue; i++)
                if (!portArray.Contains(i))
                    return i;

            return 0;
        }