C++ | Websocketpp | отправить сообщение при on_tls_init

109
24 мая 2021, 01:50

Ниже закомментирован код который должен работать, но выкидывает исключение. Как это исправить? В логе: invalid state

static context_ptr on_tls_init(client* c, websocketpp::connection_hdl hdl) {
// establishes a SSL connection
context_ptr ctx = std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23);
try {
    ctx->set_options(boost::asio::ssl::context::default_workarounds |
        boost::asio::ssl::context::no_sslv2 |
        boost::asio::ssl::context::no_sslv3 |
        boost::asio::ssl::context::single_dh_use);
}
catch (std::exception& e) {
    std::cout << "Error in context pointer: " << e.what() << std::endl;
}
//string msg = "Connected!";
//c->send(hdl, msg, websocketpp::frame::opcode::text);
return ctx; }

Ошибка:

websocketpp::exception по адресу памяти 0x00A0F444. invalid state (процесс 27376) завершает работу с кодом 0

Answer 1

Обратите внимание на порядок вызова ф-ий установления SSL соединения и непосредственно создания соединения. Не могу сказать, что Ваша ошибка заключается именно в этом, но сообщение

invalid state

говорит о нечто похожем.

#include <websocketpp/config/asio_client.hpp>
#include <websocketpp/client.hpp>
#include <iostream>
typedef websocketpp::client<websocketpp::config::asio_tls_client> client;
typedef std::shared_ptr<boost::asio::ssl::context> context_ptr;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
typedef websocketpp::config::asio_client::message_type::ptr message_ptr;

void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg) 
{
    std::cout << "on_message called with hdl: " << hdl.lock().get()
              << " and message: " << msg->get_payload()
              << std::endl;

    websocketpp::lib::error_code ec;
    c->send(hdl, msg->get_payload(), msg->get_opcode(), ec);
    if (ec) 
    {
        std::cout << "Echo failed because: " << ec.message() << std::endl;
    }
}
static context_ptr on_tls_init() 
{
    // establishes a SSL connection
    context_ptr ctx = std::make_shared<boost::asio::ssl::context>(boost::asio::ssl::context::sslv23);
    try 
    {
        ctx->set_options(boost::asio::ssl::context::default_workarounds |
                         boost::asio::ssl::context::no_sslv2 |
                         boost::asio::ssl::context::no_sslv3 |
                         boost::asio::ssl::context::single_dh_use);
    }
    catch (std::exception &e) 
    {
        std::cout << "Error in context pointer: " << e.what() << std::endl;
    }
    return ctx;
}
int main(int argc, char* argv[]) 
{
    client c;
    std::string uri = "wss://localhost";
    if (argc == 2) { uri = argv[1]; }
    try 
    {
        c.set_access_channels(websocketpp::log::alevel::all);
        c.clear_access_channels(websocketpp::log::alevel::frame_payload);
        c.init_asio();
        c.set_tls_init_handler(bind(&on_tls_init));

        c.set_message_handler(bind(&on_message,&c,::_1,::_2));
        websocketpp::lib::error_code ec;
        client::connection_ptr con = c.get_connection(uri, ec);
        if (ec) 
        {
            std::cout << "could not create connection because: " << ec.message() << std::endl;
            return 0;
        }
        c.connect(con);
        c.run();
    } 
    catch (websocketpp::exception const & e)
    {
        std::cout << e.what() << std::endl;
    }
}

Больше информации здесь.

UPD: отправка сообщения

c.connect(con);
// std::async т.к. отправляем до того, как запускаем IO сервис
auto future = std::async(std::launch::async, [&]()
{
     std::this_thread::sleep_for(3s);
     con->send("Hi!");
});
c.run();
future.get();

Из хэндлера можно убрать эту часть:

c->send(hdl, msg->get_payload(), msg->get_opcode(), ec);
READ ALSO
Дочерний блок выходит за родительский блок

Дочерний блок выходит за родительский блок

Есть header, высота 100vh, внутри него есть блок offset с двумя блоками и кнопкойПри размере экрана в 320 px этот блок съезжает вниз, выходя за родительский...

141
Как footer заложить на низ?

Как footer заложить на низ?

Всем привет! Никак не могу решить проблемуFooter никак не хочет прижиматься к низу, почему? Подскажите

267
__init__() takes 1 positional argument but 2 were given

__init__() takes 1 positional argument but 2 were given

В джанге новичок поэтому прошу помощи от более опытных людей

348
вхождения массива значений в массив вариантов

вхождения массива значений в массив вариантов

Допустим имеется два массива

82