2010-11-25 28 views
0

私はいくつかの簡単な質問がありますが、私はクライアント/サーバーアプリケーションとデータを有線で送信しています。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に入れることができますか? ご覧のとおり、私はちょっと混乱しています。サーバー/クライアントアプリケーションを設計する際に正しい決定をしたいと思います。

ありがとうございます。

答えて

1

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

TCPバッファに入力バッファを満たすのに十分なデータがない場合、読み込みは使用可能なものをフェッチし、フェッチされたバイト数を報告します。次に起こることはあなた次第です。続行したくないと判断した場合、フェッチされたバイト数に十分なデータがある可能性があります。したがって、asioは前提としません。完全な構造体を構成するのに十分なバイト数を読み取っていない場合は、さらにasync_readを開始し、十分なバイト数または何かがなくなるまでプロセスを繰り返します。

"すべてを読み取ることができません"という意味がわかりません。 2つの可能な意味が頭に浮かぶ:

  1. 構造体を満たしていない読み取るために利用できるデータの量。この場合、別のread_asyncを実行してより多くのデータが到着するまで待ちます。
  2. 構造体は、到着したすべてのデータを吸収しません。 TCPスタックは、読み取ってしまうまで未読データを単にバッファします。
+1

あなたは、async_read_someの動作です。 async_readはバッファがいっぱいになるかエラーが発生するまで終了しません。 – Timo

+0

ありがとうございます。したがって、読み込み可能なデータの量が構造体を埋めるものではなく、別のasync_readを行う場合は、不完全な構造を追跡するためにいくつかの静的バッファを使用する必要があります。 – sirAA

+0

@sirAA:いいえ、@ Timoの修正点(と私の修正)は、async_readが完了する前に構造体全体が利用可能になるまで待つことです。 –

関連する問題