2016-07-21 2 views
0

私は全二重サーバーを作成するためにboost::asioライブラリを使用しています。このような状況が起こる可能性があるのだろうかと思います。全二重通信のためにboost :: asioを使っているのは本当ですか?

  1. 独自のバッファに格納されているリクエストを受け取りました。
  2. 応答データを独自のバッファに格納しました。
  3. 私は応答を非同期的に送信し始めています。
  4. 新しいリクエストをしました。
  5. 前回入力したのと同じバッファに応答データを入力しました。
  6. まだ完了していない以前の書き込み操作のバッファは、新しい応答データで破損しています。

質問は私が書き込み操作ごとに別々のバッファを必要とするかどうか、またはバッファが何らかの種類の内部バッファにコピーされていて、同じバッファ内に新しい応答を書き込むことができますか?

答えて

1

boost :: asioは全二重操作を行うことができますが、注意深くバッファを管理する必要があります。

一般的なルールは、次のとおり与えられたソケットに

  1. のみ1読み出し動作が一度にアクティブにできます。
  2. 書き込み操作のために同じ

だから、同時に1回の書き込みと1つの読み出し動作を行うことができます。

プロセスがバッファに追加して書き込みを同時に行うことができないため、説明した状況はシングルスレッド環境で動作するはずです。しかし、トリックがあります:あなたが書き込みバッファに追加すると、現在のasync_writeが完了したかどうかを知ることができません。新しいasync_writeを開始する必要がありますか?この瞬間を注意深く検証する必要があります。

P.S.そして、いいえ、asioはバッファを内部的にコピーしません。

+0

「あなたが記述した状況はシングルスレッド環境で動作するはずです。プロセスがバッファに追加して同時に書き込みに使用することができないからです。私が記述した状況は、まさに非同期書き込みが開始されたときにバッファに書き込む状況です。 – bobeff

+0

次の* async_write *を開始する準備ができたら、進行中の* async_write *操作があるかどうかを検出し、前回の終了時に次の* async_write *を開始する方法を提案できますか? – bobeff

+0

async_writeが開始され、バッファにデータを追加するシングルスレッドの状況では、プロセスはその時点で1つのジョブしか実行しません。したがって、バッファに競合条件はありません。 2番目の質問:async_writeが処理中であることを示すフラグを設定します(ハンドラが呼び出されたときにフラグをリセットします) – PSIAlt

関連する問題