C++ boost beast websocket连接关闭处理程序

C++ boost beast websocket连接关闭处理程序,c++,boost,websocket,beast,C++,Boost,Websocket,Beast,我是boost新手,我正在尝试为websocket编写一个简单的聊天应用程序。作为参考,我正在使用网站上的示例 我创建了一个存储websocket::streams的全局向量,在创建websocket之后,在do_会话方法中,我将其推送到向量中 std::vector<websocket::stream<tcp::socket>*> socket_streams; std::vector socket\u流; 每次我读到一条消息,我都会从这个向量发送给每个人,所以到目

我是boost新手,我正在尝试为websocket编写一个简单的聊天应用程序。作为参考,我正在使用网站上的示例

我创建了一个存储websocket::streams的全局向量,在创建websocket之后,在do_会话方法中,我将其推送到向量中

std::vector<websocket::stream<tcp::socket>*> socket_streams;
std::vector socket\u流;
每次我读到一条消息,我都会从这个向量发送给每个人,所以到目前为止它运行良好。但是,当有人关闭连接时(即使未正确关闭,例如internet连接断开),我希望从向量中删除流对象。我试图在beast标题中查找“close handler”或类似的内容,但什么也找不到。有办法做到这一点吗?比如:

void close_handler(websocket::stream<tcp::socket>* _stream) 
{
   //remove _stream from socket_streams
}
void close\u处理程序(websocket::stream*\u stream)
{
//从套接字\u流中删除\u流
}

据我所知,您的问题是在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);
}
void do_会话(tcp::socket和socket)
{
websocket::流ws;
尝试
{
ws=std::move(websocket::stream>(std::move(socket));
添加_套接字(&W);
// ....
}
捕获(boost::system::system_error const&se){…}
catch(std::exception const&e){}
如果存在,则删除\u套接字\u(&ws);
}
如果移动分配不存在,您可以使用std::uniq\u ptr

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


还请注意,在使用scheme时,必须保持容器的锁,直到完成对所有套接字的写入。

我不明白,这是同步通信,因此在退出函数之前,请将其从向量中删除。还要记住在全局上使用互斥,因为套接字已经关闭,所以写操作可能会失败。感谢您的回复!是的,这是同步通信,但是函数本身是一个无限循环,正如您在boost示例中看到的那样。但是当一个客户断开连接时,我的向量元素仍然存在,我会尝试在其他人写东西时向他发送消息。我相信这会导致一个例外,因为连接已经关闭。为了避免这种情况,当有人断开连接时,我想从向量中删除vector元素。如果我说错了或者不太明白,我很抱歉。