From e7a8dc86eb1a97b1dfeaf6a1afb1e4880f0663e5 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 4 Sep 2025 10:49:33 +0200 Subject: [PATCH] =?UTF-8?q?F=C3=BCge=20Unterst=C3=BCtzung=20f=C3=BCr=20die?= =?UTF-8?q?=20Verwaltung=20von=20WebSocket-Verbindungen=20hinzu.=20Impleme?= =?UTF-8?q?ntiere=20Methoden=20zum=20Hinzuf=C3=BCgen=20und=20Entfernen=20v?= =?UTF-8?q?on=20Verbindungen=20basierend=20auf=20Benutzer-IDs.=20Aktualisi?= =?UTF-8?q?ere=20die=20WebSocket-Callback-Logik,=20um=20empfangene=20Nachr?= =?UTF-8?q?ichten=20zu=20verarbeiten=20und=20Benutzer-IDs=20zu=20setzen.?= =?UTF-8?q?=20Verbessere=20die=20Ausgabe=20von=20Debug-Informationen=20zur?= =?UTF-8?q?=20Nachverfolgung=20von=20Verbindungen=20und=20Nachrichten.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/websocket_server.cpp | 73 ++++++++++++++++++++++++++++++++++++---- src/websocket_server.h | 4 +++ 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/src/websocket_server.cpp b/src/websocket_server.cpp index 153ce64..ad71d5f 100644 --- a/src/websocket_server.cpp +++ b/src/websocket_server.cpp @@ -18,12 +18,18 @@ struct lws_protocols WebSocketServer::protocols[] = { { nullptr, nullptr, 0, 0 } }; +// Static instance pointer +WebSocketServer* WebSocketServer::instance = nullptr; + WebSocketServer::WebSocketServer(int port, ConnectionPool &pool, MessageBroker &broker, bool useSSL, const std::string& certPath, const std::string& keyPath) - : port(port), pool(pool), broker(broker), useSSL(useSSL), certPath(certPath), keyPath(keyPath) {} + : port(port), pool(pool), broker(broker), useSSL(useSSL), certPath(certPath), keyPath(keyPath) { + instance = this; +} WebSocketServer::~WebSocketServer() { stop(); + instance = nullptr; } void WebSocketServer::run() { @@ -108,24 +114,55 @@ void WebSocketServer::pingClients() { int WebSocketServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { + if (!instance) return 0; + auto *ud = reinterpret_cast(user); switch (reason) { case LWS_CALLBACK_ESTABLISHED: ud->pongReceived = true; + std::cout << "WebSocket-Verbindung hergestellt" << std::endl; break; case LWS_CALLBACK_RECEIVE: { std::string msg(reinterpret_cast(in), len); - // Here you would dispatch the received message to handleBrokerMessage or handleWebSocketMessage + std::cout << "WebSocket-Nachricht empfangen: " << msg << std::endl; + + try { + json parsed = json::parse(msg); + if (parsed.contains("event") && parsed["event"] == "setUserId") { + if (parsed.contains("data") && parsed["data"].contains("userId")) { + ud->userId = parsed["data"]["userId"]; + std::cout << "User-ID gesetzt: " << ud->userId << std::endl; + + // Verbindung in der Map speichern + instance->addConnection(ud->userId, wsi); + } + } + } catch (const std::exception &e) { + std::cerr << "Fehler beim Parsen der WebSocket-Nachricht: " << e.what() << std::endl; + } break; } case LWS_CALLBACK_SERVER_WRITEABLE: { - unsigned char buf[LWS_PRE + 4]; - memcpy(buf + LWS_PRE, "ping", 4); - lws_write(wsi, buf + LWS_PRE, 4, LWS_WRITE_TEXT); + // Prüfe ob es eine Nachricht zum Senden gibt + if (ud->pendingMessage.empty()) { + // Ping senden + unsigned char buf[LWS_PRE + 4]; + memcpy(buf + LWS_PRE, "ping", 4); + lws_write(wsi, buf + LWS_PRE, 4, LWS_WRITE_TEXT); + } else { + // Nachricht senden + unsigned char buf[LWS_PRE + ud->pendingMessage.length()]; + memcpy(buf + LWS_PRE, ud->pendingMessage.c_str(), ud->pendingMessage.length()); + lws_write(wsi, buf + LWS_PRE, ud->pendingMessage.length(), LWS_WRITE_TEXT); + ud->pendingMessage.clear(); + } break; } case LWS_CALLBACK_CLOSED: - // Remove closed connection if stored + // Verbindung aus der Map entfernen + if (!ud->userId.empty()) { + instance->removeConnection(ud->userId); + } break; default: break; @@ -139,10 +176,22 @@ void WebSocketServer::handleBrokerMessage(const std::string &message) { if (parsed.contains("user_id")) { int fid = parsed["user_id"].get(); auto userId = getUserIdFromFalukantUserId(fid); + std::cout << "Broker-Nachricht für Falukant-User " << fid << " -> User-ID " << userId << std::endl; + std::shared_lock lock(connectionsMutex); auto it = connections.find(userId); if (it != connections.end()) { + std::cout << "Sende Nachricht an User " << userId << ": " << message << std::endl; + + // Nachricht in der UserData speichern + auto *ud = reinterpret_cast(lws_wsi_user(it->second)); + if (ud) { + ud->pendingMessage = message; + } + lws_callback_on_writable(it->second); + } else { + std::cout << "Keine aktive Verbindung für User " << userId << " gefunden" << std::endl; } } } catch (const std::exception &e) { @@ -171,3 +220,15 @@ void WebSocketServer::setWorkers(const std::vector> &wor workers.push_back(wptr.get()); } } + +void WebSocketServer::addConnection(const std::string &userId, struct lws *wsi) { + std::unique_lock lock(connectionsMutex); + connections[userId] = wsi; + std::cout << "Verbindung für User " << userId << " gespeichert" << std::endl; +} + +void WebSocketServer::removeConnection(const std::string &userId) { + std::unique_lock lock(connectionsMutex); + connections.erase(userId); + std::cout << "Verbindung für User " << userId << " entfernt" << std::endl; +} diff --git a/src/websocket_server.h b/src/websocket_server.h index f2a4189..2238257 100644 --- a/src/websocket_server.h +++ b/src/websocket_server.h @@ -19,6 +19,7 @@ struct WebSocketUserData { std::string userId; bool pongReceived = true; + std::string pendingMessage; }; class Worker; // forward @@ -39,6 +40,8 @@ private: void pingClients(); void handleBrokerMessage(const std::string &message); std::string getUserIdFromFalukantUserId(int falukantUserId); + void addConnection(const std::string &userId, struct lws *wsi); + void removeConnection(const std::string &userId); static int wsCallback(struct lws *wsi, enum lws_callback_reasons reason, @@ -67,4 +70,5 @@ private: std::vector workers; static struct lws_protocols protocols[]; + static WebSocketServer* instance; };