1

サーバーアプリケーションで作業していて、たくさんのポートを開きたいです。開くことができるポートとWindowsマシンの最大数はいくつですか?ありがとう!

編集:私が意味するのは、(サーバーとして)リスニングのためにいくつのポートを開くことができるかということです

4

2 に答える 2

4

tsellsによる1つのコメントを除いて、ほとんどの人があなたに説明していないのは、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がスローされます。これは、「IgbyLargeman」が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 に答える