首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost-Beast async web socket Server-客户端异步读写,不在控制台上写入输出

Boost-Beast async web socket Server-客户端异步读写,不在控制台上写入输出
EN

Stack Overflow用户
提问于 2019-07-19 22:27:18
回答 2查看 600关注 0票数 1

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

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

server.exe 127.0.0.1 4242 1

client.exe 127.0.0.1 4242 "Hello"

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

下面是代码

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-20 02:25:57

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

代码语言:javascript
复制
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())也可以很容易地做到这一点。

参考:trying-to-understand-the-boostbeast-multibuffer

票数 2
EN

Stack Overflow用户

发布于 2019-07-19 23:55:44

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

代码语言:javascript
复制
    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处理程序:

代码语言:javascript
复制
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的字节块。

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

代码语言:javascript
复制
thread 1             thread 2
------------------------------   | steps
  async_write      |             | [1]
                   |  consume    | [2]
  cout << buffer_  |             | [3]
                                 | 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57114550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档