2

boost::asio::ip::tcp::socketクライアント/サーバーアプリケーションでデータを送受信するために使用しています。私は、パケットのサイズといくつかのフラグと「実際の」データを含むヘッダーで構成される単純な自作のデータ パケットを使用します。を使用してパケットを送信しboost::asio::writeます。場合によっては、1 つのクライアントに送信するパケットが多数あります。単純な最速のオプションは、それらを一度に送信することです。例えば

 async_write(socket, buffer(p[0].str(),p[0].size()), &callback);
 async_write(socket, buffer(p[1].str(),p[1].size()), &callback);
 async_write(socket, buffer(p[2].str(),p[2].size()), &callback);

しかし、このようにした場合、パケットがクライアントに完全に到着するという保証はありますか? この例では、パケットの最初の 4 バイトが残りのパケットのサイズを表している場合、4 回呼び出すことができますか?

uint32 size;
read(socket, buffer(&size,4));
char data[size];
read(socket, buffer(data,size));

それぞれに1つのパケットが含まれていることを確認してdataください(サイズuint32とは別に)?または、コールバック関数で次のパケットを送信すると機能しますか?

この事実が機能する場合、もう1つの質問は順序に関するものです。パケットがクライアントに到着する順序が、サーバーから送信した順序と同じであることを確認できますか?

4

1 に答える 1

5

何よりもまず、TCP ソケットはパケットではなく、データのストリームで動作します。次に、async_write()ドキュメントには、ソケットごとに 1 つの未処理の操作が実行中である可能性があることが明示的に記載されています。

async_write_someこの操作は、ストリームの関数への 0 回以上の呼び出しに関して実装され、合成操作として知られています。プログラムは、この操作が完了するまで、ストリームが他の書き込み操作 ( async_write、ストリームのasync_write_some 関数、または書き込みを実行するその他の合成操作など) を実行しないようにする必要があります。

操作をチェーンする必要がありasync_write()ます。最初の操作の完了ハンドラーが呼び出された後にのみ、2 番目の操作を呼び出します。

于 2013-01-18T17:02:04.523 に答える