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:
@@ -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
|
||||
// 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);
|
||||
} 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();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
} else {
|
||||
// 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
|
||||
std::cout << "[Debug] No user data found for WebSocket, cannot send message" << std::endl;
|
||||
#endif
|
||||
if (ret < 0) {
|
||||
std::cout << "[Debug] Failed to write WebSocket message, ret: " << ret << std::endl;
|
||||
} else {
|
||||
std::cout << "[Debug] WebSocket message written successfully, bytes: " << ret << std::endl;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void Base::sendWebSocketMessage(void* wsi, const Json::Value& out) {
|
||||
|
||||
Reference in New Issue
Block a user