4

http://tangentsoft.net/wskfaq/examples/basics/select-server.htmlにあるこの実装例を使用しています

これは私が必要とすることのほとんどを行っており、ブロックせずに接続を処理し、そのスレッドですべての作業を行います (いくつかの例のように接続ごとに新しいスレッドを作成するのではありません)。最大 64 クライアント接続:S

この 64 接続は本当ですか?

他にどのような選択肢がありますか? 同様の実装の C++ の例があると便利です。

ありがとう

4

3 に答える 3

6

代替ライブラリ:

boost asioの使用を検討する必要があります。これは、実行しなければならない多くのタスクを簡素化するクロス プラットフォームのネットワーク ライブラリです。

探しているソース コードの例は、ここで見つけることができます。


64 制限について:

優れた設計で経験するハード 64 接続制限はありません。基本的に、ある種のスレッド モデルを使用する場合、この制限は発生しません。

聞いた制限に関する情報を次に示します。

4.9 - 「64 ソケット」の制限とは?

64 ソケットには 2 つの制限があります。

Win32 イベント メカニズム (WaitForMultipleObjects() など) は、一度に 64 個のイベント オブジェクトしか待機できません。Winsock 2 は、Win32 のイベント メカニズムを使用してソケット上のイベントを待機できる WSAEventSelect() 関数を提供します。Win32 のイベント メカニズムを使用するため、一度に 64 ソケットのイベントしか待機できません。一度に 64 を超える Winsock イベント オブジェクトを待機する場合は、複数のスレッドを使用して、それぞれが 64 を超えるソケットを待機しないようにする必要があります。

また、select() 関数は、特定の状況で一度に 64 個のソケットを待機するように制限されています。winsock.h で定義されている FD_SETSIZE 定数は、select() に渡す fd_set 構造体のサイズを決定します。デフォルトでは 64 に定義されています。winsock.h を #include する前に、この定数をより高い値に定義できます。これにより、デフォルト値が上書きされます。残念ながら、少なくとも 1 つの Microsoft 以外の Winsock スタックと一部のレイヤード サービス プロバイダーは、デフォルトの 64 を想定しています。大きな fd_sets では、64 番目を超えるソケットは無視されます。

テスト プログラムを作成して、サポートする予定のシステムでこれを試し、それらが制限されていないかどうかを確認できます。そうであれば、イベント オブジェクトの場合と同様に、スレッドを使用してこれを回避できます。

ソース

于 2009-01-04T17:17:14.623 に答える
2

@ブライアン:

                if ((gConnections.size() + 1) > 64) {
                    // For the background on this check, see
                    // www.tangentsoft.net/wskfaq/advanced.html#64sockets
                    // The +1 is to account for the listener socket.
                    cout << "WARNING: More than 63 client "
                            "connections accepted.  This will not "
                            "work reliably on some Winsock "
                            "stacks!" << endl;
                }

OPへ:

なぜwinsock2を使いたくないのですか?このクロスプラットフォームを作成するのは少し注意が必要ですが、IOCPを使用して独自のサーバーを構築することを検討することもできます。ブライアンが提案したように、Boost::asioを見ることができます。

于 2009-01-04T17:25:16.727 に答える
1

'winsock2の代替手段が必要であると判断する前に、「MicrosoftWindowsのネットワークプログラミング」をお読みください。

要約すると、「Winsock2の代替」は必要ありません。ターゲットとするプラットフォームで完全に効果を発揮するために提供されているプログラミングモデルの使用方法を理解する必要があります。次に、非同期I / Oを使用するクロスプラットフォームソケットコードが本当に必要な場合はASIOを調べますが、クロスプラットフォームコードが本当に必要ない場合は、プラットフォームで発生する可能性のある問題に実際に焦点を当てたものを検討してください。あなたは焦点を合わせる必要があります-つまり、ウィンドウ固有のものです。上記の本に戻って、さまざまなオプションを確認してください。

最もパフォーマンスが高くスケーラブルなオプションは、IO完了ポートを使用することです。ここから無料のコードを入手できます。これにより、Windows(NT)ベースのプラットフォームで拡張およびパフォーマンスを向上させるサーバーを非常に簡単に作成できます。リンク先のページは、私がこれについて書いたいくつかの記事にもリンクしています。私のフレームワークとASIOの比較は、http: //www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.htmlにあります。

于 2009-01-04T22:54:48.373 に答える