我试图获取一个免费的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获得了免费端口,是否有一种方法可以检查同时分配的端口是否变为繁忙状态。
答案 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;
}