Enhance WebSocket server options and error handling

- Update server options to support multiple simultaneous connections and improve security practices.
- Allow multiple connections per IP with configurable keep-alive settings.
- Improve error handling during WebSocket service operations, ensuring critical errors lead to server shutdown.
- Refine connection closure logic to handle user IDs more robustly and log connection states accurately.
- Enable WebSocket upgrade requests while rejecting other HTTP requests for better protocol management.
This commit is contained in:
Torsten Schulz (local)
2025-11-17 16:20:44 +01:00
committed by Torsten (PC)
parent 00a5f47cae
commit 32bc126def

View File

@@ -98,8 +98,15 @@ void WebSocketServer::startServer() {
info.port = port;
info.protocols = protocols;
// Vereinfachte Server-Optionen für bessere Kompatibilität
info.options = LWS_SERVER_OPTION_VALIDATE_UTF8;
// Server-Optionen für mehrere gleichzeitige Verbindungen
info.options = LWS_SERVER_OPTION_VALIDATE_UTF8 |
LWS_SERVER_OPTION_HTTP_HEADERS_SECURITY_BEST_PRACTICES_ENFORCE |
LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME;
// Erlaube mehrere Verbindungen pro IP
info.ka_time = 60;
info.ka_probes = 10;
info.ka_interval = 10;
// SSL/TLS Konfiguration
if (useSSL) {
@@ -129,8 +136,12 @@ void WebSocketServer::startServer() {
int ret = lws_service(context, 50);
if (ret < 0) {
std::cerr << "WebSocket-Server Fehler: lws_service returned " << ret << std::endl;
// Bei kritischen Fehlern beenden, sonst weiterlaufen
if (ret == -1) {
std::cerr << "Kritischer Fehler im WebSocket-Server, beende..." << std::endl;
break;
}
}
// Kurze Pause für bessere Shutdown-Responsivität
if (running) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
@@ -301,14 +312,27 @@ int WebSocketServer::wsCallback(struct lws *wsi,
}
case LWS_CALLBACK_CLOSED:
// Verbindung aus der Map entfernen
if (!ud->userId.empty()) {
if (ud && !ud->userId.empty()) {
instance->removeConnection(ud->userId, wsi);
std::cout << "WebSocket-Verbindung geschlossen für User: " << ud->userId << std::endl;
} else {
std::cout << "WebSocket-Verbindung geschlossen (ohne User-ID)" << std::endl;
}
break;
case LWS_CALLBACK_WSI_DESTROY:
// Verbindung wird zerstört - aufräumen falls nötig
if (ud && !ud->userId.empty()) {
instance->removeConnection(ud->userId, wsi);
}
break;
case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
// Client-Verbindungsfehler (falls wir als Client fungieren)
std::cerr << "WebSocket Client-Verbindungsfehler" << std::endl;
break;
case LWS_CALLBACK_HTTP:
// HTTP-Anfragen ablehnen (nur WebSocket erlaubt)
return -1;
// Erlaube WebSocket-Upgrade-Anfragen, lehne andere HTTP-Anfragen ab
// libwebsockets behandelt WebSocket-Upgrades automatisch, daher 0 zurückgeben
return 0;
case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION:
// Protokoll-Filter für bessere Kompatibilität
return 0;