Improve null checks and logging in WebSocket server callbacks

- Add checks for user data to prevent null pointer exceptions during message handling.
- Enhance logging to provide clearer insights when user data is invalid or when exceptions occur.
- Ensure proper mutex locking when accessing the message queue to maintain thread safety.
This commit is contained in:
Torsten Schulz (local)
2025-11-20 17:26:17 +01:00
committed by Torsten (PC)
parent bb81126cd8
commit 127e95ca1c

View File

@@ -275,6 +275,11 @@ int WebSocketServer::wsCallback(struct lws *wsi,
// std::cout << "Pong-Frame von Client empfangen" << std::endl; // std::cout << "Pong-Frame von Client empfangen" << std::endl;
return 0; return 0;
case LWS_CALLBACK_RECEIVE: { case LWS_CALLBACK_RECEIVE: {
if (!ud) {
std::cerr << "[RECEIVE] ud ist nullptr" << std::endl;
return 0;
}
std::string msg(reinterpret_cast<char*>(in), len); std::string msg(reinterpret_cast<char*>(in), len);
std::cout << "WebSocket-Nachricht empfangen: " << msg << std::endl; 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; std::cout << "errorResponse: " << errorResponse.dump() << std::endl;
if (instance && wsi && ud) { if (instance && wsi && ud) {
std::cout << "instance: " << instance << std::endl; std::cout << "instance: " << instance << std::endl;
// Lege Nachricht in die Queue, ohne sofort lws_callback_on_writable aufzurufen std::cout << "wsi: " << wsi << std::endl;
{ std::cout << "ud: " << ud << std::endl;
std::lock_guard<std::mutex> lock(ud->messageQueueMutex);
ud->messageQueue.push(errorResponse.dump()); // 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<std::mutex> 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 // Verwende lws_cancel_service, um den Service zu benachrichtigen
if (instance->context) { if (instance->context) {
std::cout << "Rufe lws_cancel_service auf..." << std::endl;
lws_cancel_service(instance->context); 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) { } catch (const std::exception &e) {
std::cerr << "[RECEIVE] Fehler beim Senden der Fehlerantwort: " << e.what() << std::endl; std::cerr << "[RECEIVE] Fehler beim Senden der Fehlerantwort: " << e.what() << std::endl;