0

C ++では、複数のクライアントからの接続を受け入れることができるサーバーを作成するためのチュートリアルをいくつか読みました。彼らは非同期ソケットの使用を提案していますが、なぜ非ブロッキングモードよりも非同期を選択する必要があるのか​​私にはよくわかりません。そして、マルチスレッドを使用するアイデアはどうですか?非同期ソケットを使用するよりも優れていますか?ありがとう!!

4

2 に答える 2

1

C ++でのソリューションを要求しているので、boostasioはimoで最高の非同期ioライブラリです。

「マルチスレッド」について言及するときは、「クライアントごとに1つのスレッド」ソリューションについて話していると思います。これは、短い時間枠で多くのクライアントを期待するサーバーや同時に接続するサーバーにとっては、一般的に非常に悪い考えです。スレッドは、この用途でリソースを消費する方法です。さらに、相互排除に注意する必要があります。これは、呼び出しのブロックと組み合わせると、非常に高速にデッドロックに陥る可能性があります。そして、それはあなたが遭遇する可能性のあるものの中で最も悪いものです。

さらに、攻撃者がサーバーを悪用してスタックするのは非常に簡単です。これを回避するためにコードの設計に多くの時間を費やすことになります。これにより、読み取り不能で更新が困難なフレーズコードが発生する可能性があります。

boost.asioでは、指定されたスレッド(io_service :: runを呼び出すスレッド)は、実際に実行する作業がある場合にのみ作業を実行し、タスクに割り当てられたオブジェクトに直接誘導します。そのため、技術的には非同期もブロックされますが、スケジューラーのみが作業の実行を待機し、作業を追加する関数(接続、送信、受信、...)はすぐに返されます。

于 2012-06-27T05:51:28.840 に答える
1

UDPではなくTCPを話していると仮定します。非同期ソケットをスキップすることを強くお勧めします。これらはMicrosoftとサポーターに支持されていますが、移植性はありません。代わりに、バニラのものを使用してください。これは、サーバークライアントの例です。

于 2012-06-27T05:53:36.003 に答える