Verbessere WebSocket-Nachrichtenverarbeitung im SSLServer und Base

- Initialisiere Benutzerdaten im WebSocket-Callback, um sicherzustellen, dass Token und ausstehende Nachrichten korrekt gesetzt sind.
- Optimiere die Logik zum Senden von Nachrichten, indem Ping-Nachrichten direkt gesendet werden, um die Verbindung aufrechtzuerhalten.
- Füge Debug-Ausgaben hinzu, um den Erfolg des Nachrichtensendens zu protokollieren und die Nachverfolgbarkeit zu verbessern.
This commit is contained in:
Torsten Schulz (local)
2025-09-05 13:52:13 +02:00
parent 2effeaa025
commit 88b02c837d
2 changed files with 19 additions and 20 deletions

View File

@@ -175,6 +175,11 @@ int SSLServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, voi
#ifdef YC_DEBUG
std::cout << "[Debug] WebSocket connection established, requesting writable callback" << std::endl;
#endif
// Initialize user data
if (ud) {
ud->token = "";
ud->pendingMessage = "";
}
// Request callback when writable to send initial message
lws_callback_on_writable(wsi);
break;
@@ -196,18 +201,10 @@ int SSLServer::wsCallback(struct lws *wsi, enum lws_callback_reasons reason, voi
}
case LWS_CALLBACK_SERVER_WRITEABLE: {
if (ud->pendingMessage.empty()) {
// Ping senden
unsigned char buf[LWS_PRE + 4];
memcpy(buf + LWS_PRE, "ping", 4);
lws_write(wsi, buf + LWS_PRE, 4, LWS_WRITE_TEXT);
} else {
// Nachricht senden
unsigned char buf[LWS_PRE + ud->pendingMessage.length()];
memcpy(buf + LWS_PRE, ud->pendingMessage.c_str(), ud->pendingMessage.length());
lws_write(wsi, buf + LWS_PRE, ud->pendingMessage.length(), LWS_WRITE_TEXT);
ud->pendingMessage.clear();
}
// Send ping to keep connection alive
unsigned char buf[LWS_PRE + 4];
memcpy(buf + LWS_PRE, "ping", 4);
lws_write(wsi, buf + LWS_PRE, 4, LWS_WRITE_TEXT);
break;
}

View File

@@ -353,16 +353,18 @@ namespace Yc {
// Cast to lws* and use libwebsockets API
struct lws* lws_wsi = static_cast<struct lws*>(wsi);
// Store message in user data for sending
auto* ud = reinterpret_cast<WebSocketUserData*>(lws_wsi_user(lws_wsi));
if (ud) {
ud->pendingMessage = out;
lws_callback_on_writable(lws_wsi);
// Send message directly using lws_write
unsigned char buf[LWS_PRE + out.length()];
memcpy(buf + LWS_PRE, out.c_str(), out.length());
int ret = lws_write(lws_wsi, buf + LWS_PRE, out.length(), LWS_WRITE_TEXT);
#ifdef YC_DEBUG
if (ret < 0) {
std::cout << "[Debug] Failed to write WebSocket message, ret: " << ret << std::endl;
} else {
#ifdef YC_DEBUG
std::cout << "[Debug] No user data found for WebSocket, cannot send message" << std::endl;
#endif
std::cout << "[Debug] WebSocket message written successfully, bytes: " << ret << std::endl;
}
#endif
}
void Base::sendWebSocketMessage(void* wsi, const Json::Value& out) {