websocketspp / websockets ++ хочет сохранить обработчик, переданный в качестве параметра - PullRequest
0 голосов
/ 15 марта 2020

Мне нужна помощь с websocketspp / websockets ++, пожалуйста (https://github.com/zaphoyd/websocketpp).

Я открыт для других более простых библиотек, также C, если это в целом лучше option :)

Моя общая цель - создать веб-страницу websockets вместо клиента te lnet для DikuMUD.

Я использую пример "echo_server", который работает хорошо.

Я пытаюсь сохранить обработчик соединения "hdl" из одного обратного вызова, а затем повторно использовать его для отправки другого сообщения клиенту. Мне кажется, что hdl - это класс, который создается / уничтожается в стеке при каждом вызове функции, например, on_message.

Я бы хотел как-то сохранить hdl, например, в std :: map, чтобы я может найти его и использовать этот поиск hdl для отправки другого сообщения позже тому же клиенту.

Вот пример. Извините за пустоту, я привык к C и легкому C ++ :)

std::map<void *, void *> g_cMapHandler;

// Define a callback to handle incoming messages
void on_message(server* s, websocketpp::connection_hdl hdl, message_ptr msg)
{
    void *myExample = 0; // A value I need to be able to retrieve 

    // Using &hdl here doesn't make sense, I presume hdl gets destroyed when on_message ends.
    g_cMapHandler[&hdl] = myExample;

    // But I can't figure out what really represents hdl? Maybe there a fd / file descriptor
    // I can store somehow, and then how do I rebuild a hdl from it?
}

Спасибо: -)

1 Ответ

1 голос
/ 15 марта 2020

connection_hdl istelf указатель, хранилище connection_hdl. Это слабый указатель.

Как правило, рекомендуется избегать void* с asio и использовать умные указатели с подсчетом ссылок. Даже если вы можете контролировать время жизни объекта в синхронной программе и при необходимости вызывать free или delete, в асинхронной программе поток меняется, поэтому правильное место для свободного указателя может каждый раз быть другим.

asio может использовать boost::weak_ptr или std::weak_ptr. boost один имеет operator <, поэтому может быть непосредственно использован на карте. Для std есть std::weak_ptr<T>::owner_before, который будет использоваться для заказа, может быть использован через std::owner_less

std::map<websocketpp::connection_hdl, void *, std::owner_less<websocketpp::connection_hdl>> g_cMapHandler;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...