@@ -2406,12 +2406,14 @@ inline bool keep_alive(socket_t sock, time_t keep_alive_timeout_sec) {
24062406
24072407template <typename T>
24082408inline bool
2409- process_server_socket_core (socket_t sock, size_t keep_alive_max_count,
2409+ process_server_socket_core (const std::atomic<socket_t > &svr_sock, socket_t sock,
2410+ size_t keep_alive_max_count,
24102411 time_t keep_alive_timeout_sec, T callback) {
24112412 assert (keep_alive_max_count > 0 );
24122413 auto ret = false ;
24132414 auto count = keep_alive_max_count;
2414- while (count > 0 && keep_alive (sock, keep_alive_timeout_sec)) {
2415+ while (svr_sock != INVALID_SOCKET && count > 0 &&
2416+ keep_alive (sock, keep_alive_timeout_sec)) {
24152417 auto close_connection = count == 1 ;
24162418 auto connection_closed = false ;
24172419 ret = callback (close_connection, connection_closed);
@@ -2423,12 +2425,13 @@ process_server_socket_core(socket_t sock, size_t keep_alive_max_count,
24232425
24242426template <typename T>
24252427inline bool
2426- process_server_socket (socket_t sock, size_t keep_alive_max_count,
2428+ process_server_socket (const std::atomic<socket_t > &svr_sock, socket_t sock,
2429+ size_t keep_alive_max_count,
24272430 time_t keep_alive_timeout_sec, time_t read_timeout_sec,
24282431 time_t read_timeout_usec, time_t write_timeout_sec,
24292432 time_t write_timeout_usec, T callback) {
24302433 return process_server_socket_core (
2431- sock, keep_alive_max_count, keep_alive_timeout_sec,
2434+ svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec,
24322435 [&](bool close_connection, bool &connection_closed) {
24332436 SocketStream strm (sock, read_timeout_sec, read_timeout_usec,
24342437 write_timeout_sec, write_timeout_usec);
@@ -5540,8 +5543,9 @@ inline bool Server::is_valid() const { return true; }
55405543
55415544inline bool Server::process_and_close_socket (socket_t sock) {
55425545 auto ret = detail::process_server_socket (
5543- sock, keep_alive_max_count_, keep_alive_timeout_sec_, read_timeout_sec_,
5544- read_timeout_usec_, write_timeout_sec_, write_timeout_usec_,
5546+ svr_sock_, sock, keep_alive_max_count_, keep_alive_timeout_sec_,
5547+ read_timeout_sec_, read_timeout_usec_, write_timeout_sec_,
5548+ write_timeout_usec_,
55455549 [this ](Stream &strm, bool close_connection, bool &connection_closed) {
55465550 return process_request (strm, close_connection, connection_closed,
55475551 nullptr );
@@ -6904,14 +6908,13 @@ bool ssl_connect_or_accept_nonblocking(socket_t sock, SSL *ssl,
69046908}
69056909
69066910template <typename T>
6907- inline bool
6908- process_server_socket_ssl (SSL *ssl, socket_t sock, size_t keep_alive_max_count,
6909- time_t keep_alive_timeout_sec,
6910- time_t read_timeout_sec, time_t read_timeout_usec,
6911- time_t write_timeout_sec, time_t write_timeout_usec,
6912- T callback) {
6911+ inline bool process_server_socket_ssl (
6912+ const std::atomic<socket_t > &svr_sock, SSL *ssl, socket_t sock,
6913+ size_t keep_alive_max_count, time_t keep_alive_timeout_sec,
6914+ time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec,
6915+ time_t write_timeout_usec, T callback) {
69136916 return process_server_socket_core (
6914- sock, keep_alive_max_count, keep_alive_timeout_sec,
6917+ svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec,
69156918 [&](bool close_connection, bool &connection_closed) {
69166919 SSLSocketStream strm (sock, ssl, read_timeout_sec, read_timeout_usec,
69176920 write_timeout_sec, write_timeout_usec);
@@ -7170,7 +7173,7 @@ inline bool SSLServer::process_and_close_socket(socket_t sock) {
71707173 bool ret = false ;
71717174 if (ssl) {
71727175 ret = detail::process_server_socket_ssl (
7173- ssl, sock, keep_alive_max_count_, keep_alive_timeout_sec_,
7176+ svr_sock_, ssl, sock, keep_alive_max_count_, keep_alive_timeout_sec_,
71747177 read_timeout_sec_, read_timeout_usec_, write_timeout_sec_,
71757178 write_timeout_usec_,
71767179 [this , ssl](Stream &strm, bool close_connection,
0 commit comments