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:
committed by
Torsten (PC)
parent
bb81126cd8
commit
127e95ca1c
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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;
|
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;
|
std::cout << "lws_cancel_service(instance->context) done" << std::endl;
|
||||||
|
} else {
|
||||||
|
std::cerr << "[RECEIVE] instance->context ist nullptr" << 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;
|
||||||
|
|||||||
Reference in New Issue
Block a user