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

office@mbtelecom.ro

soft@mbtelecom.ro

Web:  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]