2

編集!バッファがいっぱいになるまで読み取りがブロックされることを読んでください。毎回1MB(私の最大バッファ長)を送信しなくても、一体どうやって小さなパケットを受信できますか?任意の長さのメッセージを送信したい場合はどうなりますか?

Javaでは、char配列を心配することなく送信できるようです。socket.read(...)しかし、ブーストソケットを備えたC ++では、すべてが揃ったと思うまで呼び出しを続けるか、無駄に思えるデータのバッファ長全体を送信する必要があるようです。

コンテキストに関する古い元の質問。

さらに、ブーストソケットは私を完全に困惑させました。ガイダンスとしてブーストSSLの例を使用 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket;しましたが、非同期呼び出しではなく、それにスレッドを割り当てました。

最初socket.read_some(...)のソケットは問題なく、すべてのバイトを読み取ります。その後、1バイトを読み取り、残りはすべて次のバイトを読み取りますが、socket.read_some(...)これは私を本当に混乱させました。次に、read_someには通常この動作があることに気付きました。それで boost::asio::read、ソケットにはメンバー関数の読み取りがあるので、私は移動しました。これは私を驚かせました。ただし、boost :: asioには、ソケットとバッファーを受け取る読み取り関数があります。ただし、永続的にブロックしています。

//read blocking data method
//now
bytesread = boost::asio::read(socket,buffer(readBuffer, max_length)); << perminatly blocks never seems to read.
//was 
//bytesread =  socket.read_some(buffer(readBuffer, max_length)); << after the 1st read it will always read one byte and need another

socket.read_some(...)呼び出しを呼び出して、残りを読み取ります。

仕事をするために何をする必要がありboost::asio::read(...)ますか?

注..サーバーが分割されたデータを送信していないことを確認するためにwiresharkを使用しました。サーバーに障害はありません。

4

1 に答える 1

3

read_some()完全なアプリケーションメッセージが表示されるまで、バッファをマージするループで読み取ります。1バイトからバッファの全長までの範囲で何でも取り戻すことができると仮定します。

「いつ終了するかを知る」ことに関しては、アプリケーションレベルのプロトコルに入ります。これは、区切りメッセージ、固定長メッセージ、ペイロード長を示す固定長ヘッダーなどのいずれかを使用できます。

于 2013-01-27T03:41:56.537 に答える