При передаче данных по именованным каналам мне нужно сериализовать некоторую структуру данных, а затем передать последовательность, состоящую из размера сериализованной структуры в байтах в виде 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
Перебор буферов в asio::streambuf ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение