私はいくつかの簡単な質問がありますが、私はクライアント/サーバーアプリケーションとデータを有線で送信しています。C++非同期ネットワークプログラミング
データを復元して適切に処理したいと考えています。
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はID +構造体を1つしか取得しないことを保証しますか?あるいは、OSが物事を最適化して両方を同じpaquetに入れることができますか? ご覧のとおり、私はちょっと混乱しています。サーバー/クライアントアプリケーションを設計する際に正しい決定をしたいと思います。
ありがとうございます。
あなたは、async_read_someの動作です。 async_readはバッファがいっぱいになるかエラーが発生するまで終了しません。 – Timo
ありがとうございます。したがって、読み込み可能なデータの量が構造体を埋めるものではなく、別のasync_readを行う場合は、不完全な構造を追跡するためにいくつかの静的バッファを使用する必要があります。 – sirAA
@sirAA:いいえ、@ Timoの修正点(と私の修正)は、async_readが完了する前に構造体全体が利用可能になるまで待つことです。 –