c++ - boost 野兽 websocket 连接关闭处理程序

标签 c++ boost websocket beast

我是 boost 的新手,我正在尝试为 websocket 编写一个简单的聊天应用程序。作为引用,我正在使用 websocket-server-sync来自网站的示例。

我制作了一个存储 websocket::streams 的全局 vector ,并在创建 websocket 后的 do_session 方法中将其推送到 vector 中。

std::vector<websocket::stream<tcp::socket>*> socket_streams;

每次我读到一条消息时,我都会从这个 vector 发送给每个人,所以到目前为止它运行良好。然而,当有人关闭连接时(即使它没有正确关闭,例如互联网连接中断)我想从我的 vector 中删除流对象。我试图在野兽 header 中寻找“关闭处理程序”或类似的东西,但我找不到任何东西。有没有办法做到这一点?喜欢:

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

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

另请注意,对于您的方案,您必须持有容器的锁,直到完成对所有套接字的写入。

关于c++ - boost 野兽 websocket 连接关闭处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50955405/

相关文章:

c# - 嵌入式文件系统?

c++ - 设置读取游标失败

c++ - 使用 boost::archive::binary_iarchive 的内存泄漏

Websocket : Is it possible to add multiple Endpoints using SockJS?

spring - 使用 Stomp 向同一主题发送多条消息

android - 显示半透明圆圈的快速动画

c++ - 如何开发基于插件的应用程序?

javascript - Websocket 跨页面 JavaScript

c++ - 使用 Boost.Log 构建 Boost "error: target { simple_event_log.mc. } has no type"

c++ - 如何使用 boost::function 参数将 lambda 传递给重写方法?