Refactor message sending in WebSocket server to utilize sendMessageToConnection

- Replace manual message queuing and error handling with the sendMessageToConnection method, which consolidates necessary checks and improves code clarity.
- Remove redundant null checks and logging related to message queue access, streamlining the callback logic.
- Enhance overall stability by leveraging existing functionality for message delivery during WebSocket events.
This commit is contained in:
Torsten Schulz (local)
2025-11-20 17:51:56 +01:00
committed by Torsten (PC)
parent 7f65f5e40e
commit 45d549aa4e

View File

@@ -366,89 +366,8 @@ int WebSocketServer::wsCallback(struct lws *wsi,
} }
// Lege Nachricht in die Queue, ohne sofort lws_callback_on_writable aufzurufen // Lege Nachricht in die Queue, ohne sofort lws_callback_on_writable aufzurufen
try { // Verwende sendMessageToConnection, das bereits alle notwendigen Prüfungen hat
std::cout << "Versuche Mutex zu locken..." << std::endl; instance->sendMessageToConnection(wsi, ud, errorResponse.dump());
// Prüfe ob ud noch gültig ist, bevor wir den Mutex locken
if (!ud) {
std::cerr << "[RECEIVE] ud ist nullptr vor Mutex-Lock" << std::endl;
break;
}
// Kopiere die Nachricht in eine lokale Variable, bevor wir den Mutex locken
std::string messageToQueue = errorResponse.dump();
std::cout << "Nachricht kopiert: " << messageToQueue.length() << " Bytes" << std::endl;
// Prüfe ob ud noch gültig ist, bevor wir den Mutex locken
if (!ud) {
std::cerr << "[RECEIVE] ud ist nullptr nach Kopieren der Nachricht" << std::endl;
break;
}
// Speichere ud-Pointer vor dem Locken, um sicherzustellen, dass er gültig bleibt
WebSocketUserData* udCopy = ud;
if (!udCopy) {
std::cerr << "[RECEIVE] udCopy ist nullptr" << std::endl;
break;
}
std::lock_guard<std::mutex> lock(udCopy->messageQueueMutex);
std::cout << "Mutex gelockt, füge Nachricht zur Queue hinzu..." << std::endl;
// Prüfe ob udCopy noch gültig ist, nachdem wir den Mutex gelockt haben
if (!udCopy) {
std::cerr << "[RECEIVE] udCopy ist nullptr nach Mutex-Lock" << std::endl;
break;
}
// Test-Zugriff auf messageQueue, um zu prüfen ob sie gültig ist
try {
volatile size_t testSize = udCopy->messageQueue.size();
(void)testSize;
std::cout << "messageQueue ist gültig, aktuelle Größe: " << udCopy->messageQueue.size() << std::endl;
} catch (...) {
std::cerr << "[RECEIVE] messageQueue ist ungültig (Exception beim Zugriff)" << std::endl;
break;
}
// Versuche, die Nachricht zur Queue hinzuzufügen
try {
std::cout << "Versuche push() aufzurufen mit Nachricht: " << messageToQueue.length() << " Bytes" << std::endl;
// Erstelle eine Kopie der Nachricht, um sicherzustellen, dass sie gültig ist
std::string msgCopy = messageToQueue;
std::cout << "Nachricht kopiert für push: " << msgCopy.length() << " Bytes" << std::endl;
// Prüfe ob udCopy noch gültig ist
if (!udCopy) {
std::cerr << "[RECEIVE] udCopy ist nullptr vor push()" << std::endl;
break;
}
// Prüfe ob messageQueue noch gültig ist
try {
volatile size_t testSize2 = udCopy->messageQueue.size();
(void)testSize2;
} catch (...) {
std::cerr << "[RECEIVE] messageQueue ist ungültig vor push()" << std::endl;
break;
}
udCopy->messageQueue.push(msgCopy);
std::cout << "push() erfolgreich, neue Größe: " << udCopy->messageQueue.size() << std::endl;
} catch (const std::exception &e) {
std::cerr << "[RECEIVE] Exception beim push(): " << e.what() << std::endl;
break;
} catch (...) {
std::cerr << "[RECEIVE] Unbekannte Exception beim push()" << std::endl;
break;
}
} 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) {
@@ -502,16 +421,8 @@ int WebSocketServer::wsCallback(struct lws *wsi,
{"data", connections} {"data", connections}
}; };
if (instance && wsi && ud) { if (instance && wsi && ud) {
// Sende die Nachricht, aber nicht während des Callbacks // Verwende sendMessageToConnection, das bereits alle notwendigen Prüfungen hat
// Die Nachricht wird in die Queue gelegt und beim nächsten WRITEABLE gesendet instance->sendMessageToConnection(wsi, ud, response.dump());
{
std::lock_guard<std::mutex> lock(ud->messageQueueMutex);
ud->messageQueue.push(response.dump());
}
// Verwende lws_cancel_service, um den Service zu benachrichtigen
if (instance->context) {
lws_cancel_service(instance->context);
}
std::cout << "[RECEIVE] getConnections: Verbindungen an Mainadmin gesendet (" << response.dump().length() << " Bytes)" << std::endl; std::cout << "[RECEIVE] getConnections: Verbindungen an Mainadmin gesendet (" << response.dump().length() << " Bytes)" << std::endl;
} }
} catch (const std::exception &e) { } catch (const std::exception &e) {