From: Bill Stoddard Date: Sun, 29 Feb 2004 22:11:03 +0000 (+0000) Subject: Win32: Tweak error messages. Do not Sleep() on AcceptEx() error X-Git-Tag: 2.0.49~63 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9fc2f2a6d2d4db9f5058af4e5c88d32c4994fb91;p=thirdparty%2Fapache%2Fhttpd.git Win32: Tweak error messages. Do not Sleep() on AcceptEx() error git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/APACHE_2_0_BRANCH@102830 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/server/mpm/winnt/child.c b/server/mpm/winnt/child.c index 1859156e7f6..c7b11f7579f 100644 --- a/server/mpm/winnt/child.c +++ b/server/mpm/winnt/child.c @@ -455,6 +455,7 @@ static PCOMP_CONTEXT win9x_get_connection(PCOMP_CONTEXT context) * Worker threads block on the ThreadDispatch IOCompletionPort awaiting * connections to service. */ +#define MAX_ACCEPTEX_ERR_COUNT 250 static void winnt_accept(void *lr_) { ap_listen_rec *lr = (ap_listen_rec *)lr_; @@ -462,7 +463,7 @@ static void winnt_accept(void *lr_) PCOMP_CONTEXT context = NULL; DWORD BytesRead; SOCKET nlsd; - int rv; + int rv, err_count = 0; apr_os_sock_get(&nlsd, lr->sd); @@ -502,24 +503,37 @@ static void winnt_accept(void *lr_) rv = apr_get_netos_error(); if ((rv == APR_FROM_OS_ERROR(WSAEINVAL)) || (rv == APR_FROM_OS_ERROR(WSAENOTSOCK))) { - /* Hack alert. Occasionally, TransmitFile will not recycle the - * accept socket (usually when the client disconnects early). - * Get a new socket and try the call again. + /* We can get here when: + * 1) the client disconnects early + * 2) TransmitFile does not properly recycle the accept socket (typically + * because the client disconnected) + * 3) there is VPN or Firewall software installed with buggy AcceptEx implementation + * 4) the webserver is using a dynamic address that has changed */ + ++err_count; closesocket(context->accept_socket); context->accept_socket = INVALID_SOCKET; - ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, ap_server_conf, - "winnt_accept: AcceptEx failed due to early client " - "disconnect. Reallocate the accept socket and try again."); + if (err_count > MAX_ACCEPTEX_ERR_COUNT) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, + "Child %d: Encountered too many errors accepting client connections. " + "Possible causes: dynamic address renewal, or incompatible VPN or firewall software. " + "Try using the Win32DisableAcceptEx directive.", my_pid); + err_count = 0; + } continue; } else if ((rv != APR_FROM_OS_ERROR(ERROR_IO_PENDING)) && (rv != APR_FROM_OS_ERROR(WSA_IO_PENDING))) { - ap_log_error(APLOG_MARK,APLOG_ERR, rv, ap_server_conf, - "winnt_accept: AcceptEx failed. Attempting to recover."); + ++err_count; closesocket(context->accept_socket); context->accept_socket = INVALID_SOCKET; - Sleep(100); + if (err_count > MAX_ACCEPTEX_ERR_COUNT) { + ap_log_error(APLOG_MARK,APLOG_ERR, rv, ap_server_conf, + "Child %d: Encountered too many errors accepting client connections. " + "Possible causes: Unknown. " + "Try using the Win32DisableAcceptEx directive.", my_pid); + err_count = 0; + } continue; } @@ -557,6 +571,7 @@ static void winnt_accept(void *lr_) } } + err_count = 0; /* Inherit the listen socket settings. Required for * shutdown() to work */