web-dev-qa-db-ja.com

(C ++)ソケットでリクエスト/レスポンスを関連付けるための理想的なデザインパターン?

私は最初の大きなC++プロジェクトに取り組んでおり、言語を理解しながら、それを使用してエレガントなデザインパターンを学習しようとしています。要求と応答の関連付けを容易にするために、各メッセージに増分されたIDが含まれているUDPソケットAPIを介した低レベルのネットワーキングがあります。これらを使用してより高レベルの非同期APIを作成します。ここでは、Pythonでエレガントな高レベルのネットワークが機能するのと同じように、応答時に呼び出されるコールバックでリクエストを送信できます。またはJS。これを実装するための推奨事項?すべてのコールバックの単純なバッファーを用意することを考えましたが、大量のトラフィックがある場合、これはかなり大きくする必要があります。また、いくつかの後に到着しない応答を処理する方法も必要ですtimeout。提案?私はBoostとC++ 11をすべて自由に使用できます。

3
A Tyshka

すべてのコールバックのバッファは基本的に不可避です。私はそれについてあまり気にしません。必要なサイズは、合計トラフィックではなく、いつでも予想される未処理の要求の数に依存するため、おそらく制限されます。信頼性の要件によっては、拡張可能なバッファーを実装することもできますが、信頼性の低いプロトコルを扱っているので、これは不要な場合さえあります。

タイムアウトの処理は、ネットワークレベルでは実際の問題ではありません。APIユーザーは、タイムアウト値と(場合によってはNULL)タイムアウトコールバックを提供するだけでよく、その後、コールバックバッファーを定期的にループするだけです(粒度は通常のタイムアウトに依存します)。値の場合、個々のリクエストごとにタイマーを設定する必要はありません)。古いリクエストのタイムアウトコールバックを呼び出して、戻りメッセージを受信するときと同じようにバッファからそれらを削除します。適切なタイムアウト時間の選択はAPIユーザーの責任であり、おそらく対処するデバイスの特性に依存します。

バッファは複数のプロセスで使用される共有リソースであるため、適切な同期プリミティブを使用してアクセスを保護する必要があります。

1