ix::WebSocketServer. По протоколу стороны обмениваются кадром.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpWsClo 695 of 696 menu
◀ ▶

Закрытие WebSocket в C++

Соединение закрывают явно: у клиента вызывают stop, у сервера останавливают прием через stop у ix::WebSocketServer.

По протоколу стороны обмениваются кадром закрытия с кодом и краткой причиной; ixwebsocket сообщает об этом событием Close в колбэке. После обмена клиент завершает работу, в обработчике печатают причину и сигнализируют main через std::atomic:

#include <atomic> #include <iostream> #include <ixwebsocket/IXWebSocket.h> #include <ixwebsocket/IXWebSocketServer.h> int main() { std::atomic<bool> link_open{false}; std::atomic<bool> shut{false}; ix::WebSocketServer server(18082, "127.0.0.1"); auto bound = server.listen(); if (!bound.first) { std::cerr << bound.second << "\n"; return 1; } server.start(); ix::WebSocket client; client.setUrl("ws://127.0.0.1:18082"); client.setOnMessageCallback( [&](const ix::WebSocketMessagePtr& msg) { if (msg->type == ix::WebSocketMessageType::Open) { link_open.store(true); link_open.notify_all(); } else if (msg->type == ix::WebSocketMessageType::Close) { std::cout << msg->closeInfo.reason << "\n"; shut.store(true); shut.notify_all(); } }); client.start(); while (!link_open.load()) { link_open.wait(false); } client.send("bye"); client.stop(); while (!shut.load()) { shut.wait(false); } server.stop(); return 0; }

Сервер тоже может закрыть конкретное соединение из колбэка сообщения, тогда Close сработает на клиенте. Порядок завершения - сначала stop у клиента, затем у сервера:

#include <atomic> #include <iostream> #include <ixwebsocket/IXWebSocket.h> #include <ixwebsocket/IXWebSocketServer.h> int main() { std::atomic<bool> link_open{false}; std::atomic<bool> shut{false}; ix::WebSocketServer server(18082, "127.0.0.1"); server.setOnClientMessageCallback( [](std::shared_ptr<ix::ConnectionState>, ix::WebSocket& peer, const ix::WebSocketMessagePtr& msg) { if (msg->type == ix::WebSocketMessageType::Message) { peer.close(1000, "done"); } }); auto bound = server.listen(); if (!bound.first) { std::cerr << bound.second << "\n"; return 1; } server.start(); ix::WebSocket client; client.setUrl("ws://127.0.0.1:18082"); client.setOnMessageCallback( [&](const ix::WebSocketMessagePtr& msg) { if (msg->type == ix::WebSocketMessageType::Open) { link_open.store(true); link_open.notify_all(); } else if (msg->type == ix::WebSocketMessageType::Close) { std::cout << msg->closeInfo.reason << "\n"; shut.store(true); shut.notify_all(); } }); client.start(); while (!link_open.load()) { link_open.wait(false); } client.send("finish"); while (!shut.load()) { shut.wait(false); } client.stop(); server.stop(); return 0; }

После одного сообщения завершите соединение со стороны клиента через stop. В колбэке Close выведите причину закрытия.

Сервер закрывает клиента с причиной "ok" после кадра "done". На клиенте напечатайте эту причину.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить