Boost-Beast 异步 Web 套接字 服务器-客户端异步读写 不在控制台上写入输出

Boost-Beast async web socket Server-Client async read-write not writing output on console

本文关键字:异步 控制台 输出 读写 套接字 Web 服务器 客户端 Boost-Beast      更新时间:2023-10-16

我正在尝试异步Web套接字服务器的Boost Beast示例 - 客户端

我正在运行如下服务器和客户端,

server.exe 127.0.0.1 4242 1

client.exe 127.0.0.1 4242 "Hello"

如果一切正常,我相信它应该在服务器命令提示符下打印"Hello">

下面是代码

void
        on_read(
        beast::error_code ec,
        std::size_t bytes_transferred)
    {
        boost::ignore_unused(bytes_transferred);
        // This indicates that the session was closed
        if (ec == websocket::error::closed)
            return;
        if (ec)
            fail(ec, "read");
        // Echo the message
        ws_.text(ws_.got_text());
        std::cout << "writing received value " << std::endl;
        ws_.async_write(
            buffer_.data(),
            beast::bind_front_handler(
            &session::on_write,
            shared_from_this()));
        std::cout << buffer_.data().data()<< std::endl;
    }

ws_.write(( 没有在控制台上写入任何内容,但是 buffer_data.data(( 渲染 00000163E044EE80

如何确保它工作正常?如何从套接字缓冲区检索字符串值?

已发送消息的行打印内容应放在async_write之前:

    std::cout << buffer_.data().data()<< std::endl;
    ws_.async_write(
        buffer_.data(),
        beast::bind_front_handler(
        &session::on_write,
        shared_from_this()));

为什么?

BOOST-ASIO/BEAST 的所有以async_开头的功能总是立即返回。它们启动一些任务,这些任务在后台 asio 核心中执行,当它们准备就绪时,调用处理程序。

查看on_write处理程序:

void
    on_write(
        beast::error_code ec,
        std::size_t bytes_transferred)
{
    boost::ignore_unused(bytes_transferred);
    if (ec)
        return fail(ec, "write");
    // Clear the buffer
    buffer_.consume(buffer_.size());  /// <---

consume 删除长度从 buffer_ 开头开始buffer_size的字节块。

您的问题是缓冲区可能已被清除,然后打印:

thread 1             thread 2
------------------------------   | steps
  async_write      |             | [1]
                   |  consume    | [2]
  cout << buffer_  |             | [3]
                                 | 

除了在使用缓冲区之前使用缓冲区外,为了转换缓冲区,我必须编写to_string_函数,该函数采用平面缓冲区并返回字符串

std::string to_string_(beast::flat_buffer const& buffer)
{
    return std::string(boost::asio::buffer_cast<char const*>(
        beast::buffers_front(buffer.data())),
        boost::asio::buffer_size(buffer.data()));
};

发现这也可以很容易地通过beast::buffers_to_string(buffer_.data())来完成。

参考 : 试图理解助推兽-多缓冲