提升野兽websocket连接关闭处理程序

时间:2018-06-20 19:08:39

标签: c++ boost websocket beast

我是新手,我正在尝试为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
}

1 个答案:

答案 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 <>。

请注意,您无法避免尝试写入关闭流的竞争条件。这就是为什么您必须处理写引发异常的情况。

还请注意,使用方案时,必须按住容器的锁,直到完成对所有套接字的写入为止。