2016-07-14 247 views
0

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

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->玩家[I] .CON).lock()== hdl.lock()就抛出异常像 '这是0xFFFFFFFFFFFFFFF7。'在文件'内存'行75.我认为这是将weak_ptr转换为shared_ptr的问题。有什么办法解决这个问题吗?

+0

看一看:https://github.com/zaphoyd/websocketpp/blob/master/examples/associative_storage/associative_storage.cpp 这表明如何可以存储每个连接的数据。 – Paul

+0

也看看con_list描述那里'typedef std :: map > con_list;' 'con_list m_connections;'因为这可能是一个更好的实现来保存列表连接。 – Paul

+0

谢谢!问题已修复 – nuclearc

回答

0

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


我不是100%肯定的是(或者不是)在当前的代码的工作,因为它是从连接存储和检索的example code(见websocketPP github上/文档例子中的方式完全不同“联想存储”)。

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

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

特别有趣的是保存所有连接的“con_list”。 这是一个typedefstd::map<connection_hdl,connection_data,std::owner_less<conn‌​ection_hdl>> con_list; con_list m_connections;,并应使您能够存储和检索连接(及其会话数据)。

+0

感谢您的回答。现在我使用set for connection_handler-s和PlayerTracker的向量。每个PlayerTracker都包含它的connection_handler的迭代器,它可以工作。但我不认为这是好方法。 – nuclearc

+0

“PlayerTracker”是什么意思?你有没有检查如何使用会话存储?您可以简单地在每个会话数据中添加数据(或对玩家对象的引用)。 – Paul