Yes, exactly. Code snippet may be uselese, but I'm using something like this:
boost::asio::read(sock, buf, boost::asio::transfer_at_least(800), myhandler);

and myhandler is never called (because no more data arrives).


So, probably 800 bytes do not arrive, or there's some other issue.

 
This handler called after each read operation and bytes_transferred each time is 400, but minimum_ is 800.

Look at the implementation of read():
(Note that bytes_transferred passed to the completion_condition is accumulated each time)

template <typename SyncReadStream, typename MutableBufferSequence,
    typename CompletionCondition>
std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
    CompletionCondition completion_condition, boost::system::error_code& ec)
{
  ec = boost::system::error_code();
  boost::asio::detail::consuming_buffers<
    mutable_buffer, MutableBufferSequence> tmp(buffers);
  std::size_t total_transferred = 0;
  tmp.set_max_size(detail::adapt_completion_condition_result(
        completion_condition(ec, total_transferred)));
  while (tmp.begin() != tmp.end())
  {
    std::size_t bytes_transferred = s.read_some(tmp, ec);
    tmp.consume(bytes_transferred);
    total_transferred += bytes_transferred;
    tmp.set_max_size(detail::adapt_completion_condition_result(
          completion_condition(ec, total_transferred)));
  }
  return total_transferred;
}