限制动态IP端口范围

时间:2014-07-10 14:56:29

标签: c# windows sockets

我创建了一个服务器应用程序,可以为其客户端动态打开端口。我现在使用一个绑定到端口0的套接字,所以我得到一个随机分配的端口。这样可以正常工作,但缺点是我需要打开防火墙中的所有端口来进行此过程。

我宁愿限制40000-41000之间的范围并选择此范围内的随机端口。有没有办法让操作系统在这个范围内选择一个空闲端口?

对于cource,我可以在这个范围内自己选择一个端口,如果它是免费的,那么就使用它。否则尝试另一个端口,直到我们找到一个自由端口。我不认为这是一个很好的解决方案。我可以注册自己的端口,但其他服务也可以保留此范围内的端口。

有人解决方案吗?我使用自定义C#4.5服务器在Windows Server 2008 R2系统上工作。

1 个答案:

答案 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) ;