Boost logo

Boost Users :

Subject: [Boost-users] [ASIO] Wrong usage of streambuf ?
From: Axel (axel.boost_at_[hidden])
Date: 2009-12-08 09:03:46


I m writing a simple client/server program. On a request the server
answers "ok\r\n". It works well. I have a problem with the client.
Using async functions, I don't manage to handle the response from the
server. Once the server sent the response, I want to read the data,
close the socket, and open a new connection to the server.

When I don't read the data sent by the server, I manage to close the
socket and repeat the operation (close the socket, and reconnect to the
When I read the data, the program seems to block.

/* Callback to the async_write function. On any request, the server
sends "ok\r_n" */
void Client::handle_write(boost::asio::ip::tcp::socket* socket, const
boost::system::error_code& err)
         cout << "Read..." << endl ;
     // response_ is a boost::asio::streambuf variable
         boost::asio::async_read_until(*socket, response_, "\r\n",
boost::bind(&Client::handle_read, this, socket,
boost::asio::placeholders::bytes_transferred)) ;
         cout << "Error when writing to host: " << err.message() << "\n" ;

void Client::handle_read(boost::asio::ip::tcp::socket* socket, const
boost::system::error_code& err, size_t bytes_transferred)
     cout << bytes_transferred << " bytes received. " << endl ;

     /* Dont count the 2 bytes long "\r\n" string */
     int message_size = bytes_transferred - 2 ;

     char * response_char = new char[message_size + 1] ;
     response_char[message_size] = '\0' ;, message_size) ;
     string result(response_char) ;
     delete response_char ;
     response_.consume(2) ;

     socket->close() ;
     delete socket ;
     connect() ;
     return ;

If I skip the block where I read the response_ into a string, the
program works flawlessly. If I try to read the response from the
streambuf variable, the program is blocked at the next call to
async_read_until() */
So I guess that I m doing something wrong with the streambuf variable
named "response_", but I dont understand what. Can someone explain me
what is wrong ?

Thanks in advance.

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at