2016-07-14 8 views
0

Ich habe ein Problem mit WebSocketPP Server. Ich möchte, dass es mehrere Clients verwaltet. Hier ist meine OnOpen-Methode:C++ - WebSocketPP mehrere Clients

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); 
} 

Aber in Trennung ich habe Problem. Ich finde nicht, welcher Player mit ID nicht verbunden ist. Hier ist meine OnClose Methode: 'Das war 0xFFFFFFFFFFFFFFF7'

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); 
      } 
     } 
    } 
} 

In Zeile (* SRV> Spieler [i] .con) .lock() == hdl.lock() wirft Ausnahme wie in der Datei 'memory' Zeile 75. Ich denke, es ist ein Problem mit der Umwandlung von weak_ptr in shared_ptr. Gibt es eine Möglichkeit, das zu beheben?

+0

Werfen Sie einen Blick auf: https://github.com/zaphoyd/websocketpp/blob/master/examples/associative_storage/associative_storage.cpp Das zeigt, wie Sie Daten pro Verbindung speichern. – Paul

+0

Schauen Sie sich auch die dort beschriebene con_list 'typedef std :: map > con_list;' 'con_list m_connections;' an, da dies eine bessere Implementierung zum Speichern einer Liste von Verbindungen. – Paul

+0

danke! Problem behoben – nuclearc

Antwort

0

Meine Kommentare schienen genug, um das Problem zu beheben (siehe Kommentare). Für zukünftige Referenz und um anzuzeigen, dass dieses Problem beantwortet wurde, habe ich diese Antwort erstellt.


Ich bin nicht 100% sicher, was ist (oder nicht) in Ihrem aktuellen Code arbeiten, da sie von der Art und Weise ganz anders die Verbindungen gespeichert und abgerufen innerhalb des example code (Siehe websocketPP Github/Dokumentation Beispiel "assoziativer Speicher").

Anhand des Beispiels sollte es ziemlich einfach sein, eine Mehrfach-Client-Struktur einzurichten, so wie es vom Bibliotheksersteller vorgesehen war.

Für Ihren spezifischen Fehler glaube ich, dass Sie auf dem richtigen Weg über die gemeinsame/schwache Zeiger-Konvertierung sind. Die beste Lösung wäre, die Liste so zu verwenden, wie sie im Beispiel verwendet wird.

Besonders interessant ist die "con_list", die alle Verbindungen speichert. Es ist ein typedef von std::map<connection_hdl,connection_data,std::owner_less<conn‌​ection_hdl>> con_list; con_list m_connections; und sollte Ihnen ermöglichen, Verbindungen (und ihre Sitzungsdaten) zu speichern und abzurufen.

+0

Danke für Ihre Antwort. Jetzt benutze ich set für connection_handler-s und vector für PlayerTrackers. Jeder PlayerTracker enthält den Iterator von connection_handler und es funktioniert. Aber ich denke nicht, dass es ein guter Weg ist. – nuclearc

+0

Was meinst du mit "PlayerTrackers"? Haben Sie überprüft, wie Sitzungsspeicher verwendet wird? Sie können einfach Daten (oder einen Verweis auf ein Player-Objekt) in Ihren Daten pro Sitzung hinzufügen. – Paul

Verwandte Themen