我的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是个问题。有没有办法解决这个问题?
答案 0 :(得分:0)
我的评论似乎足以解决问题(见评论)。 为了将来参考并表明已经回答了这个问题,我已经创建了这个答案。
我不能100%确定当前代码中有什么(或不是),因为它与example code中存储和检索连接的方式完全不同(请参阅websocketPP github / documentation示例&#34; associative storage&#34;)。
使用该示例,按照库创建者的意图设置多个客户端结构应该相当容易。
针对您的具体错误,我相信您已经在关于共享/弱指针转换的正确轨道上了。 最好的解决方案是按照它在示例中使用的方式使用列表。
特别有趣的是&#34; con_list&#34;这可以节省所有连接。
它是typedef
的{{1}},可以让您存储和检索连接(及其会话数据)。