Я не могу решить проблему. Я пытаюсь подключиться к обмену через WS, и все работает хорошо, но есть проблема. У обмена есть тайм -аут для работы над соединением, после чего обмен сбрасывает соединение, и мне нужно воссоединиться. Я знаю этот тайм-аут, и я не хочу ждать его, я хочу воссоединиться заранее в то время, удобное для меня, чтобы получить более контролируемый канал связи. Запускается, чтобы закрыть соединение и повторно открыть, обновив токен, я получаю эти ошибки и не могу установить новое соединение: < /p>
[WSCO]: [04/22/2025 23:08:12] Reconnection timer triggered. Reconnecting...
[WSCO]: [04/22/2025 23:08:18] Read error: Operation canceled. Reconnecting...
[WSCO]: [04/22/2025 23:08:24] Exception during close: Operation canceled
[WSCO]: [04/22/2025 23:08:30] Read error: Operation canceled. Reconnecting...
[WSCO]: [04/22/2025 23:08:36] Read error: Operation canceled. Reconnecting...
[WSCO]: [04/22/2025 23:08:42] Read error: Operation canceled. Reconnecting...
[WSCO]: [04/22/2025 23:08:48] Read error: Operation canceled. Reconnecting...
Я, скорее всего, делаю что -то не так с уровнями WS в Boost или SSL (возможно, что -то, что связано с синхронными событиями), но я не понимаю, что именно неправильно. /> Что у меня сейчас: Канал работает стабильно, пока соединение не будет вызвано, или таймер переподключения не будет запускается.#ifndef WEBSOCKET_CLIENT_ORDER_H
#define WEBSOCKET_CLIENT_ORDER_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define RECONNECTION_TIMEOUT 5 // number of seconds before reconnecting in case of disconnection
#define RECONNECTION_TIMER 60 // a timer in seconds at which the client himself breaks the connection and reconnects
// to update the timer on the exchange
namespace asio = boost::asio;
namespace beast = boost::beast;
namespace websocket = beast::websocket;
class WebSocketClientOrder {
public:
WebSocketClientOrder(asio::io_context& io_context, asio::ssl::context& ssl_context, const std::string& api_key, const std::string& api_secret);
void connect(const std::string& host, const std::string& port);
void place_order(const std::string &symbol_first, const std::string &symbol_second, const std::string &side_first,
const std::string &side_second, double qty);
private:
void do_read();
void reconnect();
void close();
void send_async(const std::string& message);
void process_next_message();
std::string generate_signature(long expires);
void authenticate();
void heartbeat();
asio::ip::tcp::resolver resolver_;
std::unique_ptr ws_;
beast::flat_buffer buffer_;
asio::io_context& io_context_;
asio::ssl::context& ssl_context_;
std::string host_, port_, api_key_, api_secret_;
std::queue message_queue_;
std::mutex message_queue_mutex_;
std::unique_ptr ping_timer_;
std::unique_ptr reconnection_timer_;
static const std::string DEFAULT_URI;
};
#endif // WEBSOCKET_CLIENT_ORDER_H
src/websocketclientordorder.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "WebSocketClientOrder.h"
const std::string WebSocketClientOrder::DEFAULT_URI = "/v5/trade";
WebSocketClientOrder::WebSocketClientOrder(asio::io_context& io_context, asio::ssl::context& ssl_context, const std::string& api_key, const std::string& api_secret)
: resolver_(io_context),
ssl_context_(ssl_context),
io_context_(io_context),
api_key_(api_key),
api_secret_(api_secret) {}
void WebSocketClientOrder::connect(const std::string &host, const std::string &port) {
host_ = host;
port_ = port;
try {
ws_ = std::make_unique(
io_context_, ssl_context_);
auto results = resolver_.resolve(host, port);
asio::connect(ws_->next_layer().lowest_layer(), results);
if (!SSL_set_tlsext_host_name(ws_->next_layer().native_handle(), host.c_str())) {
throw beast::system_error(
beast::error_code(static_cast(::ERR_get_error()), asio::error::get_ssl_category()),
"[WSCO]: Failed to set SNI"
);
}
ws_->next_layer().handshake(asio::ssl::stream_base::client);
ws_->handshake(host + ":" + port, DEFAULT_URI);
ws_->control_callback([this](websocket::frame_type kind, boost::beast::string_view payload) {
if (kind == websocket::frame_type::ping) {
ws_->pong(payload.data());
}
});
std::cout async_wait([this](beast::error_code ec) {
if (!ec) {
std::cout
Подробнее здесь: https://stackoverflow.com/questions/795 ... -controlle
Boost Beast WebSocket + SSL: операция отменена ошибка при попытке контролируемого переподключения таймера? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение