Сервер WebSocket в C++
Сервер WebSocket создают как ix::WebSocketServer
с портом 18082 и хостом 127.0.0.1.
Метод listen возвращает пару успеха и текста ошибки;
после удачного результата вызывают start, и прием идет
в фоне. Текст от клиента приходит в
setOnClientMessageCallback; ответ на то же соединение
шлют через send у ссылки ix::WebSocket:
#include <atomic>
#include <ixwebsocket/IXWebSocket.h>
#include <ixwebsocket/IXWebSocketServer.h>
int main() {
std::atomic<bool> link_open{false};
std::atomic<bool> round_done{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.send(msg->str);
}
});
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::Message) {
round_done.store(true);
round_done.notify_all();
}
});
client.start();
while (!link_open.load()) {
link_open.wait(false);
}
client.send("ping");
while (!round_done.load()) {
round_done.wait(false);
}
client.stop();
server.stop();
return 0;
}
Тот же прием подходит для другой фразы: в колбэке достаточно передать строку обратно без изменений. Клиент в примере лишь дожидается кадра, чтобы программа не завершилась раньше ответа:
#include <atomic>
#include <ixwebsocket/IXWebSocket.h>
#include <ixwebsocket/IXWebSocketServer.h>
int main() {
std::atomic<bool> link_open{false};
std::atomic<bool> round_done{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.send(msg->str);
}
});
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::Message) {
round_done.store(true);
round_done.notify_all();
}
});
client.start();
while (!link_open.load()) {
link_open.wait(false);
}
client.send("order 7");
while (!round_done.load()) {
round_done.wait(false);
}
client.stop();
server.stop();
return 0;
}
На входящую строку "check" сервер должен вернуть
ту же строку клиенту на 127.0.0.1.
На запрос "version" ответ сервера в кадре должен
совпадать с текстом запроса.