On Fri, May 25, 2018 at 2:49 PM, Raymond Burkholder via Boost-users <boost-users@lists.boost.org> wrote:

Would it be possible for you to post a modified snippet of your code showing your new way of doing things?

I have changed many things and that wasn't real code. But the easiest way to transform my example would be to change the header size. I went from having a CRLF limited line to a 64 bit integer, which I serialize right into the buffer. This way I always know how large it is and don't need read_until anymore. Like this:
 

void read_header_size() {

  asio::async_read(m_socket, m_streambuf, asio::transfer_at_least(8),
    [self](const boost::system::error_code, const std::size_t) {
        // < handle error skipped >

        boost::uint64_t header_size = 0;

        std::istream is(&self->m_streambuf, std::ios::binary);
        is.read(reinterpret_cast<char *>(&header_size), sizeof(header_size));

        self->read_header(header_size);
     });
}


The rest could stay as it is. We're not mixing the functions anymore.
I changed more though. Gave my packet a method to de-serialize itself from a streambuf and return the number of missing bytes or 0 if ready. Then I call this until it returns a number of bytes and only then go for more async read, with the handler calling the de-serialize again.
Advantages are less code and I can use the same method on client and server alike.

Cheers,
Stephan