C ++のサンプルサーバーソースを使用したwinsock2の代替
質問
http:// tangentsoftにあるこの実装例を使用しています。 net / wskfaq / examples / basics / select-server.html
これは私が必要とするほとんどのことを行い、ブロックせずに接続を処理し、すべてのスレッドで動作します(いくつかの例のように接続ごとに新しいスレッドを作成しません)が、winsockと言われたので心配しています最大64クライアントの接続のみをサポートします:S
この64の接続は本当ですか?
他にどのような選択肢がありますか?同様の実装のC ++の例を用意しておくといいでしょう。
ありがとう
解決
代替ライブラリ:
boost asio の使用を検討する必要があります。これは、実行しなければならないタスクの多くを簡素化するクロスプラットフォームネットワークライブラリです。
64の制限について:
優れた設計で経験するハード64接続の制限はありません。基本的に、ある種のスレッドモデルを使用する場合、この制限は発生しません。
これまでに聞いた制限に関する情報は次のとおりです。
4.9-「64ソケット」とは制限事項
64ソケットには2つの制限があります:
Win32イベントメカニズム(例: WaitForMultipleObjects())は 一度に64個のイベントオブジェクトを待ちます。 Winsock 2は できるWSAEventSelect()関数 Win32のイベントメカニズムを使用して ソケット上のイベントを待ちます。なぜなら Win32のイベントメカニズムを使用します。 64ソケットのイベントのみを待機します 時間。もっと待ちたいなら 64以上のWinsockイベントオブジェクト 時間、あなたは複数を使用する必要があります スレッドは、それぞれが 64個のソケット。
select()関数も制限されています 特定の状況で64を待つ 一度にソケット。 FD_SETSIZE winsock.hで定義されている定数 fd_setのサイズを決定します select()に渡す構造。それは デフォルトで64に定義されています。 この定数をより高い値に定義します #include winsock.hの前、および これはデフォルト値を上書きします。 残念ながら、少なくとも1つ Microsoft以外のWinsockスタックといくつか 階層化サービスプロバイダーは、 デフォルトの64。彼らは無視します 64番目を超えるソケット fd_sets。
テストプログラムを作成して試すことができます 計画しているシステムでこれ サポートしていないかどうかを確認する 制限されています。もしそうなら、あなたは得ることができます このようにスレッドで、あなたと同じように イベントオブジェクトを使用します。
他のヒント
@Brian:
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を使用して独自のサーバーを構築することを試してみることができますが、このクロスプラットフォームを作成するのは少し難しいです。 Brianが提案したBoost :: asioを見ることができます。
「winsock2の代替案」が必要だと判断する前に次をお読みください: Microsoft Windowsのネットワークプログラミング。
要約すると、「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 。