Перебор буферов в asio::streambufC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Перебор буферов в asio::streambuf

Сообщение Anonymous »

При передаче данных по именованным каналам мне нужно сериализовать некоторую структуру данных, а затем передать последовательность, состоящую из размера сериализованной структуры в байтах в виде uint32_t, за которой следуют байты сериализованной структуры.
Я узнаю сериализованный размер только после завершения сериализации. Сериализация выводит в поток (используя для этой цели asio::streambuf). Я хотел бы добавить этот размер в буфер без ненужных копий или двойной записи в канал.
Я нашел концепцию сбора/разброса в boost.asio с использованием последовательностей буфера, которые, кажется, охватывают мой точный вариант использования. Однако при переборе asio::const_buffers вstreambuf я обнаружил, что элементов больше, чем ожидалось (1 ожидаемый, 2 найдены при вычислении расстояния указателя). Действительно, при переборе буферов для объединения их в моей последовательности разыменование на втором проходе вызывает исключение нарушения доступа.
Есть ли что-то, что мне не хватает при переборе буферов в asio::streambuf?
class PacketBufferProxy
{
uint32_t size_;
std::vector seq_;
public:
PacketBufferProxy(as::streambuf& payload) :
size_{ (uint32_t)payload.size() }
{
auto i = as::buffer_sequence_begin(payload.data());
const auto e = as::buffer_sequence_end(payload.data());
auto nStreambufBuffers = std::distance(i, e);
seq_.reserve(nStreambufBuffers + 1);
seq_.emplace_back(as::buffer(&size_, sizeof(size_)));
for (; i != e; ++i) {
seq_.emplace_back(*i);
}
}
operator const std::vector& () const
{
return seq_;
}
};


Подробнее здесь: https://stackoverflow.com/questions/788 ... ostreambuf
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Копировать Boost :: asio :: Streambuf с использованием std :: ostream
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Isstream :: tellg () возвращает -1 при использовании с моим пользовательским классом Streambuf?
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Isstream :: tellg () возвращает -1 при использовании с моим пользовательским классом Streambuf?
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как я могу рефакторировать старые звонки Asio Asio
    Anonymous » » в форуме C++
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как я могу рефакторировать старые звонки Asio Asio
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»