2017-06-07 7 views
1

私のC++プログラムでhttpでパッケージを受け取ろうとしています。私はその目的のためにBoost.Asioを使用しています。ブースト.Asioのasync_read_some全体のメッセージ?

// m_buffer is declared as: std::array<char, 8192> m_buffer; 
    auto buf = boost::asio::buffer(m_buffer); 
    newConnection->getSocket().async_read_some(
     buf, 
     boost::bind(&TcpServer::handleRead, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred) 
    ); 

は、任意のパッケージを取得するには、この十分です:?私はパッケージを読み取るために、このコードを持っている私のhandleAccept方法で

8192バイトを超えるパッケージを取得するにはどうすればよいですか?

答えて

1

async_read_someは、受信したメッセージを最大でのバッファのサイズを読み取ります。受け取ったメッセージのバイト数は、コールバック関数の

のプレースホルダで返されます。受け取る予定のメッセージの最大サイズが分かっている場合は、十分に大きいバッファを使用するだけですそのメッセージのために。それ以外の場合は、async_read_someバッファの内容を別の場所にコピーし、受信したメッセージ全体をそこに蓄積する必要があります。

+0

OKです。ですから、_handleRead_の 'bytesTransferred'パラメータが0になるまで、handleReadを再帰的に呼び出す方法がありますか? – Ctwx

+1

いいえ、あなたは決して 'bytes_transferred' == 0.を受け取ることはありません。あなたのメッセージプロトコルは、メッセージの先頭でメッセージ本文のサイズを教えてくれるか、完了したらソケットを外してください。後者の場合、 'error'プレースホルダをチェックする必要があります。 – kenba

+0

よろしくお願いいたします。それはうまくいくでしょう。 – Ctwx

関連する問題