c ++ - WebSocketPP多个客户端

时间:2016-07-14 17:28:51

标签: c++ websocket

我的WebSocketPP服务器有问题。我希望它能够处理多个客户端。 这是我的OnOpen方法:

void Server::onOpen(
    Server* srv,
    WSServer* ws,
    websocketpp::connection_hdl& hdl)
{
    ServerPlayerTracker con;
    con.con = &hdl;
    con.protocolVersion = 0;
    con.verified = false;
    con.playerID = srv->playerCount++;
    con.roomID = 0;

    srv->players.push_back(con);
}

但在断线时我有问题。我无法找到ID已断开连接的播放器。这是我的OnClose方法:

void Server::onClose(
    Server* srv,
    WSServer* ws,
    websocketpp::connection_hdl& hdl)
{
    for (int i = 0; i < srv->players.size(); i++)
    {
        if (srv->players[i].connected)
        {
            if ((*srv->players[i].con).lock() == hdl.lock())
            {
                printf("[!] Player disconnected with ID: %d\n", 
                    srv->players[i].playerID);
                srv->players.erase(srv->players.begin() + i);
            }
        }
    }
}

在行中(* srv-&gt; players [i] .con).lock()== hdl.lock()它会抛出异常 '这是0xFFFFFFFFFFFFFFF7。'在文件'memory'第75行。我认为将weak_ptr转换为shared_ptr是个问题。有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

我的评论似乎足以解决问题(见评论)。 为了将来参考并表明已经回答了这个问题,我已经创建了这个答案。

我不能100%确定当前代码中有什么(或不是),因为它与example code中存储和检索连接的方式完全不同(请参阅websocketPP github / documentation示例&#34; associative storage&#34;)。

使用该示例,按照库创建者的意图设置多个客户端结构应该相当容易。

针对您的具体错误,我相信您已经在关于共享/弱指针转换的正确轨道上了。 最好的解决方案是按照它在示例中使用的方式使用列表。

特别有趣的是&#34; con_list&#34;这可以节省所有连接。 它是typedef的{​​{1}},可以让您存储和检索连接(及其会话数据)。