野兽网络套接字惯用关机

Beast websocket idiomatic shutdown?

本文关键字:关机 套接字 网络 野兽      更新时间:2023-10-16

我有我的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() 之类的操作,而不会引入某种竞争条件,即读取在取消之前开始发生。

使用 boost::asio::post 将 lambda 发布到io_context(如有必要,使用适当的strand),从而在底层basic_socket上调用 cancel。挂起的操作将立即完成,并显示 boost::asio::error::operation_aborted 。在完成处理程序中,可以检查basic_socket::is_open以了解是否应尝试新的异步调用。