diff --git a/include/swoole_server.h b/include/swoole_server.h index 853c102d056..1193ba43804 100644 --- a/include/swoole_server.h +++ b/include/swoole_server.h @@ -324,6 +324,8 @@ struct ListenPort { void close(); bool import(int sock); const char *get_protocols(); + int create_socket(swoole::Server *server); + void close_socket_fd(); #ifdef SW_USE_OPENSSL bool ssl_create_context(SSLContext *context); @@ -356,7 +358,6 @@ struct ListenPort { } size_t get_connection_num(); - int create_socket(swoole::Server *server); }; struct ServerGS { diff --git a/src/server/port.cc b/src/server/port.cc index 745864a9195..ab720038249 100644 --- a/src/server/port.cc +++ b/src/server/port.cc @@ -840,4 +840,12 @@ int ListenPort::create_socket(Server *server) { return SW_OK; } +void ListenPort::close_socket_fd() { + if (::close(socket->fd) < 0) { + swoole_sys_warning("close(%d) failed", socket->fd); + } + delete socket; + socket = nullptr; +} + } // namespace swoole diff --git a/src/server/reactor_process.cc b/src/server/reactor_process.cc index 3c6d21892bc..dd272c6e676 100644 --- a/src/server/reactor_process.cc +++ b/src/server/reactor_process.cc @@ -58,6 +58,8 @@ int Server::start_reactor_processes() { return SW_ERR; } #if defined(__linux__) && defined(HAVE_REUSEPORT) + } else { + ls->close_socket_fd(); } #endif } diff --git a/src/server/worker_threads.cc b/src/server/worker_threads.cc index 8f062fb7cc1..d906862ad47 100644 --- a/src/server/worker_threads.cc +++ b/src/server/worker_threads.cc @@ -137,6 +137,8 @@ int Server::start_worker_threads() { return SW_ERR; } #if defined(__linux__) && defined(HAVE_REUSEPORT) + } else { + ls->close_socket_fd(); } #endif }