boost beast websocket connection close handler
我是新手,我正在尝试为websocket编写一个简单的聊天应用程序。作为参考,我使用网站上的websocket-server-sync示例。
我创建了一个全局向量来存储websocket :: streams,并在创建websocket之后在do_session方法中将其推入向量中。
1 | std::vector<websocket::stream<tcp::socket>*> socket_streams; |
每次我读到一条消息后,我都会通过该引导程序将其发送给所有人,因此到目前为止,它的运行情况都很好。但是,当有人关闭连接时(即使它没有正确关闭,例如互联网连接断开),我想从矢量中删除流对象。我试图在兽头中寻找"关闭处理程序"或类似内容,但找不到任何东西。有没有办法做到这一点?像:
1 2 3 4 | void close_handler(websocket::stream<tcp::socket>* _stream) { //remove _stream from socket_streams } |
据我了解,您的问题是将流的生存期延长到try / catch子句之外。
假设构造函数可以抛出该异常,则可以在try内使用copy构造函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void do_session(tcp::socket& socket) { websocket::stream<tcp::socket> ws; try { ws = std::move(websocket::stream<tcp::socket>>(std::move(socket))); add_socket(&ws); // .... } catch(boost::system::system_error const& se) { ... } catch(std::exception const& e) {} erase_socket_if_exists(&ws); } |
如果不存在移动分配,则可以使用std :: uniq_ptr <>。
请注意,您无法避免尝试写入关闭流的竞争条件。这就是为什么您必须处理写引发异常的情况。
还请注意,对于您的方案,必须持有容器的锁,直到完成对所有套接字的写入为止。