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