diff --git a/src/websocket_server.cpp b/src/websocket_server.cpp index 5869d45..a4187d5 100644 --- a/src/websocket_server.cpp +++ b/src/websocket_server.cpp @@ -275,6 +275,11 @@ int WebSocketServer::wsCallback(struct lws *wsi, // std::cout << "Pong-Frame von Client empfangen" << std::endl; return 0; case LWS_CALLBACK_RECEIVE: { + if (!ud) { + std::cerr << "[RECEIVE] ud ist nullptr" << std::endl; + return 0; + } + std::string msg(reinterpret_cast(in), len); std::cout << "WebSocket-Nachricht empfangen: " << msg << std::endl; @@ -334,17 +339,45 @@ int WebSocketServer::wsCallback(struct lws *wsi, std::cout << "errorResponse: " << errorResponse.dump() << std::endl; if (instance && wsi && ud) { std::cout << "instance: " << instance << std::endl; - // Lege Nachricht in die Queue, ohne sofort lws_callback_on_writable aufzurufen - { - std::lock_guard lock(ud->messageQueueMutex); - ud->messageQueue.push(errorResponse.dump()); + std::cout << "wsi: " << wsi << std::endl; + std::cout << "ud: " << ud << std::endl; + + // Prüfe ob ud noch gültig ist, indem wir versuchen, auf ein einfaches Feld zuzugreifen + try { + // Test-Zugriff auf ud, um zu prüfen ob es gültig ist + volatile bool test = ud->pongReceived; + (void)test; // Unterdrücke Warnung + std::cout << "ud ist gültig, pongReceived: " << ud->pongReceived << std::endl; + } catch (...) { + std::cerr << "[RECEIVE] ud ist ungültig (Exception beim Zugriff)" << std::endl; + break; } - std::cout << "ud->messageQueue.size(): " << ud->messageQueue.size() << std::endl; + + // Lege Nachricht in die Queue, ohne sofort lws_callback_on_writable aufzurufen + try { + std::cout << "Versuche Mutex zu locken..." << std::endl; + std::lock_guard lock(ud->messageQueueMutex); + std::cout << "Mutex gelockt, füge Nachricht zur Queue hinzu..." << std::endl; + ud->messageQueue.push(errorResponse.dump()); + std::cout << "ud->messageQueue.size(): " << ud->messageQueue.size() << std::endl; + } catch (const std::exception &e) { + std::cerr << "[RECEIVE] Fehler beim Zugriff auf messageQueue: " << e.what() << std::endl; + break; + } catch (...) { + std::cerr << "[RECEIVE] Unbekannter Fehler beim Zugriff auf messageQueue" << std::endl; + break; + } + // Verwende lws_cancel_service, um den Service zu benachrichtigen if (instance->context) { + std::cout << "Rufe lws_cancel_service auf..." << std::endl; lws_cancel_service(instance->context); + std::cout << "lws_cancel_service(instance->context) done" << std::endl; + } else { + std::cerr << "[RECEIVE] instance->context ist nullptr" << std::endl; } - std::cout << "lws_cancel_service(instance->context) done" << std::endl; + } else { + std::cerr << "[RECEIVE] instance, wsi oder ud ist nullptr" << std::endl; } } catch (const std::exception &e) { std::cerr << "[RECEIVE] Fehler beim Senden der Fehlerantwort: " << e.what() << std::endl;