2016-07-14 192 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