我如何分配一个字符串来提升 beast multi_buffer?

How do I assign a string to boost beast multi_buffer?

我找到了许多示例,说明如何将 boost::beast::multi_buffer 的内容复制到字符串,但是如何将字符串的内容分配给之前在中创建的 multi_buffer一个 class 个实例?

如果我的 class 中有示例声明:

private:
    boost::beast::websocket::stream<boost::asio::ip::tcp::socket> ws_;
    boost::asio::strand<boost::asio::io_context::executor_type> strand_;
    boost::beast::multi_buffer buffer_;

如何在调用之前将字符串分配给 buffer_:

ws_.async_write(buffer_.data(), boost::asio::bind_executor(strand_,
    std::bind(&CNXG_session::on_write,
            shared_from_this(),
            std::placeholders::_1,
            std::placeholders::_2)));

你可以在prepare之后使用boost::asio::buffer_copy:

size_t n = buffer_copy(b.prepare(contents.size()), boost::asio::buffer(contents));

演示

Live On Coliru

#include <iostream>
#include <boost/asio/buffers_iterator.hpp>
#include <boost/beast.hpp>

using boost::beast::multi_buffer;

void dump_buffer(std::ostream& os, multi_buffer const& mb) {
    os << mb.size() << " (" << mb.capacity() << ") "
       << "'" << boost::beast::buffers(mb.data()) << "'\n";
}

int main() {
    boost::beast::multi_buffer b;
    dump_buffer(std::cout << "before: ", b);

    std::string const contents = "Hello world";

    size_t n = buffer_copy(b.prepare(contents.size()), boost::asio::buffer(contents));
    b.commit(n);

    dump_buffer(std::cout << "after: ", b);
}

版画

before: 0 (0) ''
after: 11 (512) 'Hello world'

注意:也许您会对 Boost asio 1.66.0 中的新缓冲设施感兴趣:dynamic_buffer (Dynamically sized boost::asio::buffer)

您还可以使用 boost::beast::ostream 函数将 DynamicBuffer 转换为 std::ostream 您可以写入:

boost::beast::multi_buffer b;
boost::beast::ostream(b) << "Hello, world!\n";