質問

簡単な質問がいくつかあります。クライアントサーバーアプリケーションとワイヤーに送信されたデータがあります。

データを回復し、適切に処理できるようにしたいと思います。

struct T1
{
   int id;
   int foo;
};

struct T2
{
  int id;
  char foo;
  int bar;
};

これらの構造を取り上げましょう。T1またはT2のいずれかが続くかどうかを判断するINTの前にネットワークに送信されます。クライアントがT1を送信してからT2を送信した場合、ASIO :: IP :: TCP :: Socket.Async_Read()で完全な構造を読むことができるという保証がありますか?単一の構造体を処理するハンドラーをセットアップしたいのですが、単一のasync_read()ですべてを読むことができない場合はどうなりますか?

非同期操作は、次の条件のいずれかが当てはまるまで続きます。

  • 付属のバッファーはいっぱいです。つまり、転送されるバイトはバッファサイズの合計に等しくなります。
  • エラーが発生しました。

読み取れないデータを破棄しますか?別のasync_readをトリガーしますか?そして、クライアントがID+構造を順次送信した場合、ASYNC_READは1つのID+構造を取得することを保証しますか?または、OSが物事を最適化し、両方を同じパケに入れますか?ご覧のとおり、私は少し混乱しています。サーバー/クライアントアプリケーションを設計する際に正しい決定を下したいと思います。

ありがとうございました。

役に立ちましたか?

解決

編集:間違いを指摘してくれた@timoに感謝します。 async_readは、構造体全体が読み取られるまで完了しないため、ループする必要はありません。そうでなければ、私の答えは同じです。 TCPプロトコルがどのように分割されたり、データを合体したりするかに関係なく、何も失われません。

入力バッファーを埋めるためにTCPバッファーに十分なデータがない場合、読み取りは利用可能なものをすべて取得し、取得したバイト数を報告します。次に起こることはあなた次第です。継続したくないと判断するのに十分なデータがあるかもしれません。そのため、ASIOは仮定しません。完全な構造を構成するのに十分なバイトを読んでいない場合は、さらにASYNC_READを開始し、十分なバイトまたは何かが死ぬまでプロセスを繰り返します。

「すべてを読むことができない」という意味がわかりません。 2つの考えられる意味が思い浮かびます:

  1. 読み取ることができるデータの量は、構造体を埋めません。 この場合、別のread_asyncを実行して、より多くのデータが到着するのを待つだけです。
  2. 構造体は、到着したすべてのデータを吸収しません。 TCPスタックは、読み取りに到達するまで、未読のデータを単純にバッファリングします。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top