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