2016-07-14 4 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); 
} 

Но разъединение у меня есть проблемы. Я не могу найти, какой игрок с идентификатором отключен. Вот мой 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-> игроки [я] .CON) .lock() == hdl.lock() он бросает исключение, как "это было 0xFFFFFFFFFFFFFFF7. в файле 'memory' line 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», который сохраняет все соединения. Это typedef из std::map<connection_hdl,connection_data,std::owner_less<conn‌​ection_hdl>> con_list; con_list m_connections; и должен позволить вам сохранять и извлекать соединения (и их данные сеанса).

+0

Спасибо за ваш ответ. Теперь я использую set для connection_handler-s и vector для PlayerTrackers. Каждый PlayerTracker содержит итератор connection_handler, и он работает. Но я не думаю, что это хороший способ. – nuclearc

+0

Что значит «PlayerTrackers»? Вы проверили, как использовать хранилище сеансов? Вы можете просто добавить данные (или ссылку на объект игрока) в свои данные сеанса. – Paul

Смежные вопросы