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;
|
||||
return 0;
|
||||
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::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<std::mutex> 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<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
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user