From 88b02c837dd91c107b3f08c264ee6c53e8e27e8d Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 5 Sep 2025 13:52:13 +0200 Subject: [PATCH] Verbessere WebSocket-Nachrichtenverarbeitung im SSLServer und Base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Initialisiere Benutzerdaten im WebSocket-Callback, um sicherzustellen, dass Token und ausstehende Nachrichten korrekt gesetzt sind. - Optimiere die Logik zum Senden von Nachrichten, indem Ping-Nachrichten direkt gesendet werden, um die Verbindung aufrechtzuerhalten. - Füge Debug-Ausgaben hinzu, um den Erfolg des Nachrichtensendens zu protokollieren und die Nachverfolgbarkeit zu verbessern. --- src/core/ssl_server.cpp | 21 +++++++++------------ src/lib/base.cpp | 18 ++++++++++-------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/core/ssl_server.cpp b/src/core/ssl_server.cpp index be6af3c..c5a0258 100644 --- a/src/core/ssl_server.cpp +++ b/src/core/ssl_server.cpp @@ -175,6 +175,11 @@ int SSLServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, voi #ifdef YC_DEBUG std::cout << "[Debug] WebSocket connection established, requesting writable callback" << std::endl; #endif + // Initialize user data + if (ud) { + ud->token = ""; + ud->pendingMessage = ""; + } // Request callback when writable to send initial message lws_callback_on_writable(wsi); break; @@ -196,18 +201,10 @@ int SSLServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, voi } case LWS_CALLBACK_SERVER_WRITEABLE: { - 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(); - } + // Send ping to keep connection alive + unsigned char buf[LWS_PRE + 4]; + memcpy(buf + LWS_PRE, "ping", 4); + lws_write(wsi, buf + LWS_PRE, 4, LWS_WRITE_TEXT); break; } diff --git a/src/lib/base.cpp b/src/lib/base.cpp index 23580e7..a46bb2a 100755 --- a/src/lib/base.cpp +++ b/src/lib/base.cpp @@ -353,16 +353,18 @@ namespace Yc { // Cast to lws* and use libwebsockets API struct lws* lws_wsi = static_cast(wsi); - // Store message in user data for sending - auto* ud = reinterpret_cast(lws_wsi_user(lws_wsi)); - if (ud) { - ud->pendingMessage = out; - lws_callback_on_writable(lws_wsi); + // Send message directly using lws_write + unsigned char buf[LWS_PRE + out.length()]; + memcpy(buf + LWS_PRE, out.c_str(), out.length()); + int ret = lws_write(lws_wsi, buf + LWS_PRE, out.length(), LWS_WRITE_TEXT); + + #ifdef YC_DEBUG + if (ret < 0) { + std::cout << "[Debug] Failed to write WebSocket message, ret: " << ret << std::endl; } else { - #ifdef YC_DEBUG - std::cout << "[Debug] No user data found for WebSocket, cannot send message" << std::endl; - #endif + std::cout << "[Debug] WebSocket message written successfully, bytes: " << ret << std::endl; } + #endif } void Base::sendWebSocketMessage(void* wsi, const Json::Value& out) {