From 3ac9f25284f33b6f23b9eaa2c98ef5b3f967fd79 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Tue, 18 Nov 2025 08:12:01 +0100 Subject: [PATCH] Enhance WebSocket server socket options and connection handling - Add support for setting SO_REUSEADDR in the WebSocket server to allow port reuse, improving server flexibility. - Implement callbacks for socket adoption to ensure SO_REUSEADDR is set when applicable. - Refine server options to streamline connection management and enhance overall performance. --- src/websocket_server.cpp | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/websocket_server.cpp b/src/websocket_server.cpp index 2167e37..19aae89 100644 --- a/src/websocket_server.cpp +++ b/src/websocket_server.cpp @@ -6,6 +6,9 @@ #include #include #include +#include +#include +#include using json = nlohmann::json; @@ -101,11 +104,14 @@ void WebSocketServer::startServer() { info.port = port; info.protocols = protocols; + // Setze Socket-Optionen-Callback für SO_REUSEADDR + // Hinweis: In älteren libwebsockets-Versionen muss SO_REUSEADDR manuell gesetzt werden + // Wir versuchen es über einen Callback, falls verfügbar + // 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 | - LWS_SERVER_OPTION_REUSE_ADDR; // Erlaube Port-Wiederverwendung (SO_REUSEADDR) + LWS_SERVER_OPTION_SKIP_SERVER_CANONICAL_NAME; // Erlaube mehrere Verbindungen pro IP info.ka_time = 60; @@ -346,6 +352,18 @@ int WebSocketServer::wsCallback(struct lws *wsi, case LWS_CALLBACK_RAW_CONNECTED: // Raw-Verbindungen behandeln return 0; + case LWS_CALLBACK_RAW_ADOPT_FILE: + case LWS_CALLBACK_RAW_ADOPT: + // Setze SO_REUSEADDR für den Socket (falls noch nicht gesetzt) + // Hinweis: Diese Callbacks werden möglicherweise nicht für Listen-Sockets aufgerufen + { + int fd = lws_get_socket_fd(wsi); + if (fd >= 0) { + int reuse = 1; + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); + } + } + return 0; default: break; }