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

标签 c++ boost boost-asio boost-beast

我正在尝试异步的 Boost Beast 示例 web socket server - client

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

server.exe 127.0.0.1 4242 1

client.exe 127.0.0.1 4242 "你好"

如果一切正常,我相信它应该在服务器命令提示符下打印“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()));

为什么?

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

查看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());  /// <---

consumebuffer_ 的开头移除长度为 buffer_size 的字节 block 。

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

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

关于c++ - Boost-Beast 异步网络套接字服务器-客户端异步读写不在控制台上写入输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57114550/

相关文章:

c++ - 如何从嵌套的PROGMEM数组中读取uint32_t值?

c++ - 创建自定义 boost 序列化输出存档

c++ - 带有 boost::throw_exception 问题的 PCL 构建

c++ - 如何找出路径是否满足某个父级?

c++ - boost asio取消读取而不取消写入

c++ - Boost Beast 关闭后重新连接 websocket 连接

c++ - 无法将缩略图按钮添加到窗口?

c++ - 在 OpenCV 中使用自定义相机(通过 GStreamer)

c++ - 如何使用 ofstream 在 C++ 中将 512x512 像素数组写入 bmp 文件(256 色和 8 bpp)?

performance - 有人做过 boost::asio 的性能分析吗?