簡體   English   中英

Boost-Beast異步Web套接字Server-Client異步讀寫未在控制台上寫入輸出

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

我正在嘗試異步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_ ALWAYS開頭的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());  /// <---

consumebuffer_的開頭刪除長度為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())輕松完成。

參考: 試圖了解boostbeast-multibuffer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM