野兽async_read()如何工作并且有选项吗?

时间:2019-04-05 07:52:36

标签: c++ websocket boost-asio ibm-watson boost-beast

我对boost::asio的基础知识不太熟悉。我正在执行一项已连接到Web服务器并读取响应的任务。响应在生成响应时以随机时间抛出。

为此,我正在使用boost::beast基础之上的boost::asio库。

我发现async_read()函数正在等待接收响应。

现在,问题是:在documentations & example中,显示了websocket通信的异步方式,其中websocket收到响应后便关闭了。

以下代码(野兽文档)完成

void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "write");

    // Read a message into our buffer
    ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
}

void close_ws_(boost::system::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "read");

    // Close the WebSocket connection
    ws_.async_close(websocket::close_code::normal, std::bind(&session::on_close, shared_from_this(), std::placeholders::_1));
}

在此程序中,假定发送已在接收之前完成。而且只有一次响应来自服务器。之后,它(客户端)前进并关闭websocket。

但是在我的程序中

我必须检查书写部分是否已经结束,如果没有结束,那么在编写过程中,websocket应该出现,并检查响应,直到现在为止所写的内容。

现在,我放置了一个if,它将告诉我的程序我的写作是否受到强迫?如果不是,则程序应返回到写入部分并写入所需的内容。如果是,请关闭连接。

void write_bytes(//Some parameters) {
    //write on websocket

    //go to read_resp
}

void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "write");

    // Read a message into our buffer
    if (write_completed){
        ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
    } else {
        ws_.async_read(buffer_, std::bind(&session::write_bytes, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
    }
}

void close_ws_(//Some parameters) {
    //Same as before
}

现在我要做的是写入完成后,等待3秒钟,每隔1秒钟读取一次网络套接字,然后在3秒钟后关闭网络套接字。

为此,我还另外提供了一个检查read_resp的3秒条件

void read_resp(boost::system::error_code ec, std::size_t bytes_transferred) {
    boost::ignore_unused(bytes_transferred);

    if(ec)
        return fail(ec, "write");

    // Read a message into our buffer
    if (write_completed){
        if (3_seconds_completed) {
            ws_.async_read(buffer_, std::bind(&session::close_ws_, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
        } else {
            usleep(1000000); //wait for a second
            ws_.async_read(buffer_, std::bind(&session::read_resp, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
        }
    } else {
        ws_.async_read(buffer_, std::bind(&session::write_bytes, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
    }
}

但是网络套接字正在等待async-read接收到某些信息,并且这样做只会导致会话超时。

如何只看是否有要阅读的内容,然后继续执行回叫?

1 个答案:

答案 0 :(得分:0)

这可能只是我这里问题的答案。我无法保证将来的读者可以使用该解决方案。

我已经删除了read_resp()自循环,只是在async_read()时让close_ws_移到write_completed == true

async_read会一直等待,直到它收到响应,并且不会继续进行下一步,从而导致超时。