1

我正在开发一个服务器应用程序,我想打开很多端口。我可以打开的最大端口数和一台 Windows 机器是多少?谢谢!

编辑:我的意思是我可以打开多少个端口进行监听(作为服务器)

4

2 回答 2

4

除了 tsells 的一条评论外,大多数人没有向您解释的是,您很可能对 tcp 堆栈通常如何工作有一个无效的假设(这实际上是我直到不久前才混淆的东西)。

原因是当您有一个 TcpListener (特定于 DotNet 但可能适用于大多数其他 tcp 库)时,当您开始侦听并发生传入连接时,堆栈将侦听您选择的端口(例如:端口:1234 ) 但一旦连接就会将连接移动到(通常)随机未分配的端口。

因此,例如查看以下代码。

  // Set the TcpListener on port 13000.
  Int32 port = 13000;
  IPAddress localAddr = IPAddress.Parse("127.0.0.1");

  // TcpListener server = new TcpListener(port);
  server = new TcpListener(localAddr, port);

  // Start listening for client requests.
  server.Start();

  // Buffer for reading data
  Byte[] bytes = new Byte[256];
  String data = null;

  // Enter the listening loop.
  while(true) 
  {
    Console.Write("Waiting for a connection... ");

    // Perform a blocking call to accept requests.
    // You could also user server.AcceptSocket() here.
    TcpClient client = server.AcceptTcpClient();            
    Console.WriteLine("Connected!");
    //Here you will find that if you look at the client LocalEndPoint a random dynamic port will be assigned.
  }

这基本上意味着,除非你有一个非常好的理由,否则你不应该真正关心这些实现细节,并且最大开放端口基本上是无关紧要的(也祝你好运尝试编写产生 30000 个线程并正确维护这些连接的东西并且有效)。

PS:当提供端口号时,我还在 System.Net.Sockets.TcpListener 内部验证了以下代码,如果它未通过此测试,将抛出 ArgumentOutOfRangeException。这证实了“Igby Largeman”所说的,它是一个 16 位无符号整数。

public static bool ValidateTcpPort(int port) 
{
    if (port >= 0)
    {
        return port <= 0xffff;  //65535
    }
    return false;
}
于 2012-04-17T03:56:47.123 回答
0

..要看。我在 W2K 上有 24000 个连接,尽管它需要一些注册表调整。我确信 Windows Server 2008 将允许接近 64K 最大值。

于 2012-04-16T23:37:06.620 回答