c ++ websocketpp ждать ответа - PullRequest
       4

c ++ websocketpp ждать ответа

0 голосов
/ 19 февраля 2019

Я получаю основной поток с http-сервером и фоновый поток с клиентом Websocketpp, который должен отправить сообщение на сервер Websocket.Я пытаюсь отправить некоторые данные из основного потока и использовать для этого глобальную переменную.это выглядит так:

Global var:

extern client* SendClient; //for sending message
extern websocketpp::connection_hdl hdlSend;
extern nlohmann::json Result; //for get result

WebSocket:

void on_open(client* c, websocketpp::connection_hdl hdl, std::string sid, std::string type, std::string streamName) {

    std::cout << "SET CONNECTION TO STREAM " << std::endl;

    hdlSend = hdl;
    SendClient = c;

    std::string resp = "Start";
    c->send(hdl, resp, websocketpp::frame::opcode::text);


}

void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg, std::string sid, std::string types) {

    std::string GetMess = msg->get_payload();
    function FUNC;

    if (DEBUG == true)
        FUNC.make_log("DEBUG", "Get Mess: " + GetMess, false);

    Result.clear();

    try {
    Result = nlohmann::json::parse(GetMess);
    }
    catch (nlohmann::json::parse_error e) {
        Result["code"] = -1;
    }


    websocketpp::lib::error_code ec;


    if (ec) {
        std::cout << "Echo failed because: " << ec.message() << std::endl;
    }
}


run()
{

std::string uri = "wss://0.0.0.0:4477/";


    client c;

    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, sid, type));
        c.set_open_handler(bind(&on_open, &c, ::_1, sid, type, streamName));
        c.set_close_handler(bind(&on_close, &c, ::_1, type, sid));


        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;

        }


        c.connect(con);

        c.run();

}

и код для теста.Я вызываю сервер WebSocket в потоке -> sleep, чтобы дождаться соединения, а затем отправляю 2 сообщения

std::thread CachingTh(CachingRun); 
CachingTh.detach(); // send WebSocket to background thread

SendClient->get_con_from_hdl(hdlSend)->send("Start", websocketpp::frame::opcode::text); // Send hello, server must return "Start"



nlohmann::json Send;
Send["type"] = "Setint";
Send["key"] = "test";
Send["value"] = "test"; 

SendClient->get_con_from_hdl(hdlSend)->send(Send.dump(), websocketpp::frame::opcode::text); // Send json, server must return "is_ok"

std::cout << "Result: " << Result.dump() << std::endl; // get result

std::cout << "**********************" << std::endl;

После этого в результате получаю:

Get Mess: Start
Get Mess: is_ok
CachResult: Start

, но должно быть:

Get Mess: Start
Get Mess: is_ok
CachResult: is_ok

Тогда, насколько я понимаю, клиент должен ждать ответа от сервера WebSocket.Можете ли вы помочь мне, как правильно реализовать вышеуказанную задачу?Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...