From c17be437676d0970127cdc7544f845d41a2f8331 Mon Sep 17 00:00:00 2001 From: JP Meijers Date: Fri, 20 Feb 2026 17:21:48 +0200 Subject: [PATCH 1/4] Set SO_REUSEADDR on http port --- tools/server/server-http.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/server/server-http.cpp b/tools/server/server-http.cpp index 00897eeea5..466871e8a1 100644 --- a/tools/server/server-http.cpp +++ b/tools/server/server-http.cpp @@ -72,6 +72,12 @@ bool server_http_context::init(const common_params & params) { srv.reset(new httplib::Server()); #endif + // Enable address reuse to allow immediate restart of server + srv->set_socket_options([](socket_t sock) { + int val = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); + }); + srv->set_default_headers({{"Server", "llama.cpp"}}); srv->set_logger(log_server_request); srv->set_exception_handler([](const httplib::Request &, httplib::Response & res, const std::exception_ptr & ep) { From bb9fcb96c5ecacc24707b76029d8c361dd843c35 Mon Sep 17 00:00:00 2001 From: JP Meijers Date: Fri, 20 Feb 2026 18:06:23 +0200 Subject: [PATCH 2/4] Move socket option to bind and listen function --- tools/server/server-http.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tools/server/server-http.cpp b/tools/server/server-http.cpp index 466871e8a1..9e60e89ea7 100644 --- a/tools/server/server-http.cpp +++ b/tools/server/server-http.cpp @@ -72,12 +72,6 @@ bool server_http_context::init(const common_params & params) { srv.reset(new httplib::Server()); #endif - // Enable address reuse to allow immediate restart of server - srv->set_socket_options([](socket_t sock) { - int val = 1; - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); - }); - srv->set_default_headers({{"Server", "llama.cpp"}}); srv->set_logger(log_server_request); srv->set_exception_handler([](const httplib::Request &, httplib::Response & res, const std::exception_ptr & ep) { @@ -288,6 +282,13 @@ bool server_http_context::start() { was_bound = srv->bind_to_port(hostname, 8080); } else { LOG_INF("%s: binding port with default address family\n", __func__); + + // Enable address reuse to allow immediate restart of server + srv->set_socket_options([](socket_t sock) { + int flag = 1; + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); + }); + // bind HTTP listen port if (port == 0) { int bound_port = srv->bind_to_any_port(hostname); From 0e93d6e4537bf9ec559b82bb6eb43e5b7f6316a3 Mon Sep 17 00:00:00 2001 From: JP Meijers Date: Sat, 21 Feb 2026 08:43:56 +0200 Subject: [PATCH 3/4] Use a constant chat for flag value --- tools/server/server-http.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/server/server-http.cpp b/tools/server/server-http.cpp index 9e60e89ea7..3397b68fba 100644 --- a/tools/server/server-http.cpp +++ b/tools/server/server-http.cpp @@ -285,7 +285,7 @@ bool server_http_context::start() { // Enable address reuse to allow immediate restart of server srv->set_socket_options([](socket_t sock) { - int flag = 1; + const char flag = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); }); From 4d7c07a2f3428242c5a55dcb0682af00d10e114b Mon Sep 17 00:00:00 2001 From: JP Meijers Date: Tue, 24 Feb 2026 16:05:10 +0200 Subject: [PATCH 4/4] Use instead SO_LINGER with timeout of 0 seconds --- tools/server/server-http.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/server/server-http.cpp b/tools/server/server-http.cpp index 3397b68fba..bf05ec7f59 100644 --- a/tools/server/server-http.cpp +++ b/tools/server/server-http.cpp @@ -283,10 +283,12 @@ bool server_http_context::start() { } else { LOG_INF("%s: binding port with default address family\n", __func__); - // Enable address reuse to allow immediate restart of server + // Set linger time to 0 to force close the socket immediately when the server stops srv->set_socket_options([](socket_t sock) { - const char flag = 1; - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)); + linger sl{}; + sl.l_onoff = 1; + sl.l_linger = 0; + setsockopt(sock, SOL_SOCKET, SO_LINGER, reinterpret_cast(&sl), sizeof(sl)); }); // bind HTTP listen port