Ниже закомментирован код который должен работать, но выкидывает исключение. Как это исправить? В логе: 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
Обратите внимание на порядок вызова ф-ий установления 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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть header, высота 100vh, внутри него есть блок offset с двумя блоками и кнопкойПри размере экрана в 320 px этот блок съезжает вниз, выходя за родительский...
Всем привет! Никак не могу решить проблемуFooter никак не хочет прижиматься к низу, почему? Подскажите
В джанге новичок поэтому прошу помощи от более опытных людей