0 / 0 / 0
Регистрация: 14.04.2023
Сообщений: 19
1

boost::asio async write не знаю как сделать subscribe в wss

03.01.2024, 04:49. Показов 1264. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
HI Everyone!

Подскажите как мне вставить в этот код функцию, которая при удачном коннекте к websocket будет сразу отправлять json строку. Это отправка json документа в сокет подписывает на определенный канал.

Сам JSON делаю вручную например:
std::string write_data = R"({"mode": "subscribe",id: 123})";

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
.....
private:
  void async_start(const std::string &host, const std::string &port,
                   const std::string &target, on_message_received_cb cb,
                   holder_type holder) {
    m_host = host;
    m_target = target;
 
    m_resolver.async_resolve(
        m_host, port,
        [this, cb = std::move(cb), holder = std::move(holder)](
            boost::system::error_code ec,
            boost::asio::ip::tcp::resolver::results_type res) mutable {
          if (ec) {
            if (!m_stop_requested) {
              ;
            }
          } else {
            async_connect(std::move(res), std::move(cb), std::move(holder));
          }
        });
  }
 
  void async_connect(boost::asio::ip::tcp::resolver::results_type res,
                     on_message_received_cb cb, holder_type holder) {
    if (!SSL_set_tlsext_host_name(m_ws.next_layer().native_handle(),
                                  m_host.c_str())) {
      auto error_code =
          boost::beast::error_code(static_cast<int>(::ERR_get_error()),
                                   boost::asio::error::get_ssl_category());
      return;
    }
 
    boost::asio::async_connect(
        m_ws.next_layer().next_layer(), res.begin(), res.end(),
        [this, cb = std::move(cb), holder = std::move(holder)](
            boost::system::error_code ec,
            boost::asio::ip::tcp::resolver::iterator) mutable {
 
          if (ec) {
            if (!m_stop_requested) {
              ;
            }
          } else {
            on_connected(std::move(cb), std::move(holder));
          }
        });
  }
 
  void on_connected(on_message_received_cb cb, holder_type holder) {
    m_ws.control_callback([this](boost::beast::websocket::frame_type kind,
                                 boost::beast::string_view payload) mutable {
      (void)kind;
      (void)payload;
 
      m_ws.async_pong(boost::beast::websocket::ping_data{},
                      [](boost::beast::error_code ec) {
                        (void)ec;
                      });
    });
 
    m_ws.next_layer().async_handshake(
        boost::asio::ssl::stream_base::client,
        [this, cb = std::move(cb),
         holder = std::move(holder)](boost::system::error_code ec) mutable {
          if (ec) {
            if (!m_stop_requested) {
              ;
            }
          } else {
            on_async_ssl_handshake(std::move(cb), std::move(holder));
          }
        });
  }
  void on_async_ssl_handshake(on_message_received_cb cb, holder_type holder) {
    m_ws.async_handshake(m_host, m_target,
                         [this, cb = std::move(cb), holder = std::move(holder)](
                             boost::system::error_code ec) mutable {
                           start_read(ec, std::move(cb), std::move(holder));
                         });
  }
 
  void start_read(boost::system::error_code ec, on_message_received_cb cb,
                  holder_type holder) {
    if (ec) {
      if (!m_stop_requested) {
        ;
      }
      stop();
      return;
    }
 
    m_ws.async_read(m_buf,
                    [this, cb = std::move(cb), holder = std::move(holder)](
                        boost::system::error_code ec, std::size_t rd) mutable {
                      on_read(ec, rd, std::move(cb), std::move(holder));
                    });
  }
 
  void on_read(boost::system::error_code ec, std::size_t rd,
               on_message_received_cb cb, holder_type holder) {
    if (ec) {
      if (!m_stop_requested) {
        ;
      }
 
      stop();
 
      return;
    }
 
    auto size = m_buf.size();
    assert(size == rd);
 
    std::string strbuf;
    strbuf.reserve(size);
 
    for (const auto &it : m_buf.data()) {
      strbuf.append(static_cast<const char *>(it.data()), it.size());
    }
    m_buf.consume(m_buf.size());
 
    bool ok = cb(0, std::string{}, strbuf.data(), strbuf.size());
    if (!ok) {
      stop();
    } else {
      start_read(boost::system::error_code{}, std::move(cb), std::move(holder));
    }
  }
.....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.01.2024, 04:49
Ответы с готовыми решениями:

Boost::asio клиет-сервер - есть ощущение, что где-то что-то блокируется, не знаю как это дебажить
Привет! Область эта для меня новая, поэтому такие вопросы. Смотрите - есть асинхронный...

Как сделать timeout в boost::asio coroutine ?
Что-то я совсем запуталась. Если кто-то сталкивался с websocket, помогите разобраться как вставить...

Как сделать http запрос в boost.asio?
Здравствуйте. Как сделать запрос в с++ пользуясь boost asio Например на c# все просто. ...

Boost asio ssl connect не получается сделать timeout 10sec
Не очень-то я сильна в библиотеке boost 1.67.0, от чего прошу помощи экспертов. Спустя какое-то...

Boost::Asio Сделать так, чтобы сервер отвечал на запросы из браузера
Добрый день! Взял один из примеров Boost по асинхронным серверам. Данный код сервера-клиента...

0
03.01.2024, 04:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.01.2024, 04:49
Помогаю со студенческими работами здесь

HTTPS запрос к Telegram API с Boost Beast & Boost Asio (Не работает)
#include &quot;root_certificates.hpp&quot; #include &lt;boost/beast/core.hpp&gt; #include...

Как собрать boost.asio ?
Захотелось использовать asio с openssl . Для этого требуется asio в виде lib . Скачал boost ....

Как подружить boost asio и UML
Добрый день. Решил для своего самописного колхозного сервера сделать описание, которое бы помогло...

Boost::asio::read как заставить работать с таймаутом?
При чтении данных из порта, если нет ответа, то поток уходит в бесконечное ожидание. Может кто-то...

Boost::asio как обнаружить дисконнект на удалённой машине?
В данный момент обрабатываю дисконнекты, глядя на возвращаемые коды ошибок после вызовов...

Как с Boost Asio подключиться к серверу (mqtt) и сообщение
Здравствуйте, в интернете нет примера, я не нашел, помогите пожалуйста очень нужно, вопрос лежит в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru