Закрытие 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". На клиенте напечатайте эту
причину.