我创建了一个服务器应用程序,可以为其客户端动态打开端口。我现在使用一个绑定到端口0的套接字,所以我得到一个随机分配的端口。这样可以正常工作,但缺点是我需要打开防火墙中的所有端口来进行此过程。
我宁愿限制40000-41000之间的范围并选择此范围内的随机端口。有没有办法让操作系统在这个范围内选择一个空闲端口?
对于cource,我可以在这个范围内自己选择一个端口,如果它是免费的,那么就使用它。否则尝试另一个端口,直到我们找到一个自由端口。我不认为这是一个很好的解决方案。我可以注册自己的端口,但其他服务也可以保留此范围内的端口。
有人解决方案吗?我使用自定义C#4.5服务器在Windows Server 2008 R2系统上工作。
答案 0 :(得分:1)
IPGlobalProperties
可以为您提供当前繁忙的端口。这是你可以做到的一种方式:
// Returns available port number or zero if no port is available
public static int GetFirstAvailableRandomPort (int startPort, int stopPort)
{
Random r = new Random() ;
IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();
var busyPorts = tcpConnInfoArray.Select(t => t.LocalEndPoint.Port).Where(v => v >= startPort&& v <= stopPort ).ToArray() ;
var firstAvailableRandomPort = Enumerable.Range(startPort, stopPort - startPort).OrderBy(v => r.Next()).FirstOrDefault(p => !busyPorts .Contains(p))
return firstAvailableRandomPort ;
}
用法:
var randomPort = GetFirstAvailableRandomPort(40000, 41000) ;