7

1つの実際のネットワークインターフェイスといくつかのループバックインターフェイスを備えたWindows7があるとします。クライアントからの接続を受け入れるIOCP対応サーバーがあります。サーバーへの実際のクライアント接続を可能な限りシミュレートしようとしています。

私のクライアントコードは、X個のソケット接続を確立するだけです(クライアントは特定のインターフェイスにバインドすることに注意してください)。

        const Int32 remotePort = 12345;
        const Int32 MaxSockets = 60000;

        Socket[] s = new Socket[MaxSockets];
        IPEndPoint bindEndpoint = new IPEndPoint(IPAddress.Parse(args[0]), 0);
        for (Int32 i = 0; i < MaxSockets; i++)
        {
            s[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s[i].SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            s[i].Bind(bindEndpoint);
            s[i].Connect(args[1], remotePort);

            IPEndPoint socketInfo = (IPEndPoint)s[i].LocalEndPoint;
            Console.WriteLine(String.Format("Connected socket {0} {1} : {2}", i, socketInfo.Address, socketInfo.Port));
        }

ループバックインターフェイスには、バインディングに使用するIPがいくつかあります。さらに、実際のインターフェイスを使用してバインドします。開いているソケットの数がマシンあたり約64Kの場合、問題が発生しました。

未処理の例外:System.Net.Sockets.SocketException:システムに十分なバッファスペースがないか、キューがいっぱいであるため、ソケットでの操作を実行できませんでした

私は次のようないくつかの役に立たないことを試しました:-MaxUserPortを最大値に設定し、レジストリで他のいくつかの推奨されるTCPIP設定。-異なるインターフェイス(実際のインターフェイスとループバック)で2つのサーバーを実行しようとし、複数のクライアントを使用します。

それはWindowsの既知の制限ですか、それとも何らかの方法でそれを克服する可能性がありますか?

助けてくれてありがとう!

4

4 に答える 4

5

マイクロソフトのページで次のことを見つけました。

... HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort レジストリ サブキーは、ワイルドカード バインドに割り当てることができる最大ポート数として定義されます。レジストリ エントリの値はMaxUserPort、動的ポート範囲を定義します...

したがって、エンドポイントに特定のポートを使用するように強制すると、たとえば

IPEndPoint bindEndpoint = new IPEndPoint(IPAddress.Parse(args[0]), 54321);

次に、システムで 64K を超えるソケットを同時に開くことができます。

于 2012-02-29T19:33:11.617 に答える
1

コード例では、を呼び出していますが、がどのように定義されているかをBind(bindEndpoint)示していません。bindEndpointそれを確認します :

  • システムには実際には複数のIPアドレスがあります(ループバックはカウントされません)
  • 実際には、エンドポイントのIPアドレスを(ループバックではなく)IPアドレスに設定しています。
  • バインドは複数のIPアドレスに分散されています

多くのシステムはループバックアドレスをルーティングとバインディングの目的で特別に処理するため、ループバックアドレスはカウントされません。INADDR_ANYしたがって、ループバックでポートにバインドすると、 ( )にバインドした場合と同じように、すべてのアドレスのポートが吸い上げられる可能性があります0.0.0.0

于 2012-02-29T16:59:03.603 に答える
0

TCP と UDP はどちらも、符号なし 16 ビット整数を使用してポート番号を指定します。どのオペレーティング システムのどの実装でも、バインドされたアドレスごとにせいぜい 65535 を超えるソケットを開くことができるとは思いません。さらに、Windows が各アダプターまたはバインドされたアドレスごとに完全に分離された状態テーブルを実装せず、代わりにグローバル状態テーブルに依存していても驚かないでしょう。その場合、ソフトで構成可能な制限ではなく、Windows ネットワーク アーキテクチャの制限になります。

于 2016-06-28T16:14:54.627 に答える
0

負荷テストツールを開発しました。

Windows 10/16G RAM で実行すると、サーバーとの 60,000 接続を正常に作成できました。

ただし、さらに接続を作成しようとすると、ツールはすぐに「socket WinError 10055 No Buffer Space Available」を報告します。

この記事によると、制限は開いているファイルの数ではなく、OS全体の全体的なソケットバッファサイズであると思います。

于 2020-07-07T08:02:31.797 に答える