Как объединить два boost :: asio :: streambuf? - PullRequest
6 голосов
/ 27 февраля 2012

Я использую boost::asio в качестве сетевого фреймворка. В качестве носителя для чтения / записи используется boost::asio::streambuf. Я хочу:

  • читать сообщения в одном буфере
  • добавить второй буфер в начале первого
  • отправить новое составное сообщение

Каковы возможные эффективные (нулевое копирование) варианты для этого?

Ответы [ 2 ]

7 голосов
/ 01 марта 2012

Принцип называется scatter/gather IO. В основном это способ передачи нескольких буферов одновременно (по порядку) без дорогостоящего копирования в память. Он хорошо поддерживается в boost :: asio с очень гибкой и мощной (но также трудной для понимания) концепцией буферов и концепцией последовательности буферов.

Простой (непроверенный, но я верный) пример, с которого можно начать, будет:

std::vector<boost::asio::streambuf::const_buffers_type> buffers;
buffers.push_back( my_first_streambuf.data() );
buffers.push_back( my_second_streambuf.data() );

std::size_t length = boost::asio::write( mySocket, buffers );

Конечно, одним простым вариантом было бы просто прочитать оба сообщения в streambuf и просто отправить весь streambuf, но, исходя из вашего вопроса, я предполагаю, что по какой-то причине это не вариант?

0 голосов
/ 27 февраля 2012

Функция asio::buffer free может принимать набор буферов (например, this ), результирующий буфер является не копией буферов, а последовательностью, которая будет отправлена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...