Здравствуйте, abrarov, Вы писали:
A>Вы же как-то будете определять тип пакета (не по размеру, конечно, потому что TCP — потоковый протокол)? Таким образом, в completion_condition в худшем случае при получении min_size Вы уже точно сможете сказать каким типом пакета (не)является полученная последовательность байт.
Да, Вы абсолютно правы, я как-то упустил "TCP — потоковый протокол" в погоне за сферической общностью

. completion_condition полностью покрывает то, что необходимо.
A>Такого ограничения внутри Asio нет (есть, кажется, ограничение на кол-во буферов в BufferSequence). То, что Вы отправляете 1Мб, вовсе не означает, что принимающая сторона получит этот мегабайт за одну операцию чтения. Если Вам это не знакомо (учитывая Ваше "что-то упустил"), то рекомендую "Эффективное программирование TCP/IP", Йон Снейдер.
Под "что-то упустил" я имел в виду что-то в работе/документации asio. Да, за одну операцию (read_some в терминах asio) я 1Мб могу не получить. Но я использую free метод read или async_read, которые, как я полагаю, делают работу за меня. Т.е. вызов read или async_read последовательно вызывают read_some/async_reaad_some до тех пор, пока мой буфер не будет заполнен или не произойдет ошибка (completion_condition — transfer_all, по-умолчанию). Интересует меня следующее поведение mutable_buffers:
// read method
std::vector<uchar> read_buff(90000);
boost::asio::async_read(io_object_, boost::asio::buffer(buffer, 90000),
boost::bind(&CommonMedium::operation_completed, this,
&error, &transfered, ph::error, ph::bytes_transferred));
Когда вызывается конструктор mutable_buffers_1 там явно проверяется размер буфера и если он > buffer_max_length, то размер созданного буфера ограничивается этой константой (65535). Т.е. я прошу 90000, а transfer_all ожидает 65535. Вот собственно я и интересуюсь или я что-то не понял или это так нужно.