【问题标题】:Beast websocket idiomatic shutdown?野兽websocket惯用关闭?
【发布时间】:2019-06-04 00:21:51
【问题描述】:

我有我的 C++ 程序。主线程创建一个专用于仅处理 websocket 的新线程。这个新线程使用例如 boost beast 的 async_read() 调用进行读写。这很像https://www.boost.org/doc/libs/1_69_0/libs/beast/example/websocket/server/async/websocket_server_async.cpp,每个异步调用都会引发另一个异步调用。

但是什么是让主线程告诉 websocket 线程关闭的惯用方法,因为可能总会有一些异步读取或写入调用未完成,例如 async_read() 空闲等待服务器最终发送数据。关闭需要执行诸如取消剩余的 async_read() 之类的操作,而不会引入某种竞争条件,即在取消之前开始读取。

【问题讨论】:

  • 测试do_accept()中的原子标志是否继续接受新连接?
  • 嗯.. 我认为这不是一个好主意。相反,只需从正确的隐式或显式链调用接受器上的close

标签: c++ boost-beast


【解决方案1】:

使用boost::asio::postio_context 发布一个lambda(必要时使用适当的strand),它在底层basic_socket 上调用cancel。待处理的操作将立即通过boost::asio::error::operation_aborted 完成。在您的完成处理程序中,您可以检查 basic_socket::is_open 以了解您是否应该尝试新的异步调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多