
Hello Vadim, This is a piece of code from an application that inadvertently does what your application appears to be doing: receives a stream of images over a HTTP connection. We had the same problems and you have in bold the solution we found: we call in_avail() on the read-buffer of the stream that tells us the amount of data already read but left in the buffer and then we readsome to get the actual data. void onConnect(boost::system::error_code ErrorCode,unsigned int fps) { boost::asio::streambuf response; boost::asio::read_until(*Socket, response, "\r\n"); std::istream response_stream(&response); response_stream >> http_version; response_stream >> status_code; std::getline(response_stream, status_message); if (!response_stream || http_version.substr(0, 5) != "HTTP/") { THROW_EXCEPTION(logic_error("Invalid HTTP response")); } // Read the response headers, which are terminated by a blank line. boost::asio::read_until(*Socket, response, "\r\n\r\n"); while (std::getline(response_stream, header) && header != "\r") { LOG_DEBUG(log,"Got http header: "<<header); } //Get the number of bytes we have received after the HTTP header size_t avail = response_stream.rdbuf()->in_avail(); //Read that data into the buffer response_stream.readsome(Buffer.data(), avail ); LOG_DEBUG(log,"Connection succeded. Already received "<<avail); //Call the asynchronous receive handler as if an read operation was completed with avail bytes of data onReadComplete(ErrorCode,avail ,fps); } void onReadComplete(const boost::system::error_code& ErrorCode,size_t bytesTransfered,unsigned int fps) { if (!ErrorCode) { boost::asio::async_read( *Socket, boost::asio::buffer(Buffer), boost::asio::transfer_all(), boost::bind( & onReadComplete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, fps ) ); } } Best regards, ---- Emil Mieilica IT Manager Office and mailing : Calea Bucuresti no 3A, Otopeni, Ilfov, Romania Tel: +40 21 350 40 57 ; +40 21 350 40 54 ; +40 21 350 40 55 ; +40 21 350 40 56 ; +4031.620.0212; +4031.620.0213; +4743.26.4142 Fax: +40 21 350 15 80 E-mail: emilm@mbtelecom.ro<mailto:emilm@mbtelecom.ro> office@mbtelecom.ro<mailto:office@mbtelecom.ro> soft@mbtelecom.ro<mailto:soft@mbtelecom.ro> Web: http://www.mbtelecom.com<http://www.mbtelecom.com/> From: boost-users-bounces@lists.boost.org [mailto:boost-users-bounces@lists.boost.org] On Behalf Of Vadim Shmelev Sent: Monday, December 15, 2008 1:55 PM To: boost-users@lists.boost.org Subject: Re: [Boost-users] Buffering and ASIO
Good day. I'm trying to read video data transferred by HTTP. I use the following function in order to read HTTP header: [sip]