Enhance WebSocket server ping/pong handling and timeout settings

- Introduce handling for LWS_CALLBACK_RECEIVE_PONG to manage Pong frames received from clients.
- Update the WebSocketUserData structure to increase MAX_PING_TIMEOUTS from 3 to 5, allowing more attempts before disconnection.
- Extend PONG_TIMEOUT_SECONDS from 10 to 60 to accommodate longer response times from browsers.
- Modify ping handling to send a WebSocket Ping frame instead of a text message for better protocol compliance.
This commit is contained in:
Torsten Schulz (local)
2025-11-18 10:32:55 +01:00
committed by Torsten (PC)
parent 0eb3a78332
commit e3f46d775a
2 changed files with 16 additions and 9 deletions

View File

@@ -250,16 +250,23 @@ int WebSocketServer::wsCallback(struct lws *wsi,
std::cout << "Client-Adresse: " << client_addr << std::endl; std::cout << "Client-Adresse: " << client_addr << std::endl;
break; break;
} }
case LWS_CALLBACK_RECEIVE_PONG:
// WebSocket Pong-Frame empfangen (automatische Antwort auf Ping)
ud->pongReceived = true;
ud->lastPongTime = std::chrono::steady_clock::now();
ud->pingTimeoutCount = 0;
// std::cout << "Pong-Frame von Client empfangen" << std::endl;
return 0;
case LWS_CALLBACK_RECEIVE: { case LWS_CALLBACK_RECEIVE: {
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;
// Pong-Antwort behandeln // Fallback: Pong als Text-Nachricht (für Kompatibilität)
if (msg == "pong") { if (msg == "pong") {
ud->pongReceived = true; ud->pongReceived = true;
ud->lastPongTime = std::chrono::steady_clock::now(); ud->lastPongTime = std::chrono::steady_clock::now();
ud->pingTimeoutCount = 0; ud->pingTimeoutCount = 0;
std::cout << "Pong von Client empfangen" << std::endl; std::cout << "Pong (Text) von Client empfangen" << std::endl;
break; break;
} }
@@ -313,13 +320,13 @@ int WebSocketServer::wsCallback(struct lws *wsi,
} }
} }
} else { } else {
// Ping senden // WebSocket Ping-Frame senden (nicht Text-Nachricht!)
ud->lastPingTime = std::chrono::steady_clock::now(); ud->lastPingTime = std::chrono::steady_clock::now();
ud->pongReceived = false; ud->pongReceived = false;
unsigned char buf[LWS_PRE + 4]; // Leeres Ping-Frame senden (Browser antworten automatisch mit Pong)
memcpy(buf + LWS_PRE, "ping", 4); unsigned char buf[LWS_PRE + 0];
lws_write(wsi, buf + LWS_PRE, 4, LWS_WRITE_TEXT); lws_write(wsi, buf + LWS_PRE, 0, LWS_WRITE_PING);
// std::cout << "Ping an Client gesendet" << std::endl; // std::cout << "Ping-Frame an Client gesendet" << std::endl;
} }
break; break;
} }

View File

@@ -25,9 +25,9 @@ struct WebSocketUserData {
std::chrono::steady_clock::time_point lastPingTime; std::chrono::steady_clock::time_point lastPingTime;
std::chrono::steady_clock::time_point lastPongTime; std::chrono::steady_clock::time_point lastPongTime;
int pingTimeoutCount = 0; int pingTimeoutCount = 0;
static constexpr int MAX_PING_TIMEOUTS = 3; static constexpr int MAX_PING_TIMEOUTS = 5; // Mehr Versuche bevor Trennung
static constexpr int PING_INTERVAL_SECONDS = 30; static constexpr int PING_INTERVAL_SECONDS = 30;
static constexpr int PONG_TIMEOUT_SECONDS = 10; static constexpr int PONG_TIMEOUT_SECONDS = 60; // Längeres Timeout (Browser können länger brauchen)
}; };
class Worker; // forward class Worker; // forward