feat: working on ydi server

This commit is contained in:
Sara Gerretsen 2025-10-09 12:16:43 +02:00
parent ce2b4e7c7b
commit 019e326c6f
2 changed files with 104 additions and 5 deletions

View file

@ -1,7 +1,11 @@
#include "ydi_server.h"
#include <core/templates/vector.h>
#include <mutex>
#include <optional>
#include <stop_token>
#include <chrono>
#include <thread>
#include <unordered_set>
#include <zmq.hpp>
#include <zmq_addon.hpp>
@ -9,12 +13,78 @@ namespace ydi::server {
struct Service {
std::optional<zmq::context_t> context{ std::nullopt };
std::optional<zmq::socket_t> socket{ std::nullopt };
std::unordered_set<ClueID> revealedClues{};
std::recursive_mutex mtx{};
std::atomic<bool> stop_threads{ false };
std::optional<std::string> client{ std::nullopt };
};
std::optional<Service> service{ std::nullopt };
thread_local std::optional<std::thread> receiveThread{ std::nullopt };
thread_local std::optional<std::thread> pingThread{ std::nullopt };
void open(int port) {
void receive_thread_entry() {
using namespace std::chrono_literals;
zmq::multipart_t incoming{};
while (service->stop_threads) {
std::this_thread::sleep_for(20ms);
std::scoped_lock lock{ service->mtx };
if (incoming.recv(*service->socket)) {
}
}
}
void ping_thread_entry() {
using namespace std::chrono_literals;
{ std::scoped_lock lock{ service->mtx };
if (!service->client) {
return;
}
}
static zmq::multipart_t ping{ make_multipart(*service->client, std::string("PING")) };
while (!service->stop_threads) {
std::this_thread::sleep_for(1s);
std::scoped_lock lock{ service->mtx };
ping.send(*service->socket);
}
}
void open() {
service.emplace();
try {
service->context.emplace(1);
} catch (...) {
service.reset();
return;
}
try {
service->socket.emplace(*service->context, zmq::socket_type::router);
} catch (...) {
service->context->close();
service->context.reset();
service.reset();
return;
}
try {
service->socket->connect("tcp://*:6667");
} catch (...) {
service->socket->close();
service->socket.reset();
service->context->close();
service->context.reset();
service.reset();
}
receiveThread.emplace(receive_thread_entry);
}
void close() {
if (service) {
std::scoped_lock lock{ service->mtx };
service->socket->close();
service->socket.reset();
service->context->close();
service->context.reset();
service.reset();
}
}
}