Ruediger Pluem wrote: > > Not exactly. I would prefer to fix the basic issue with Windows. If we need to > support milliseconds for connection timeouts seems to be another story for me. > Can some of the Windows gurus come to the rescue to either confirm and explain > why it takes that long for connect to return after trying to connect to a > closed > port (on the same machine !!!) or if this must be a local issue on a specific > machine.
Apparently, nobody is using apr_socket_connect() much on win32 to have noticed this before, but the implementation; if (connect(sock->socketdes, (const struct sockaddr *)&sa->sa.sin, sa->salen) == SOCKET_ERROR) { int rc; struct timeval tv, *tvptr; fd_set wfdset, efdset; rv = apr_get_netos_error(); if (rv != APR_FROM_OS_ERROR(WSAEWOULDBLOCK)) { return rv; } [...] if (sock->timeout < 0) { tvptr = NULL; } else { /* casts for winsock/timeval definition */ tv.tv_sec = (long)apr_time_sec(sock->timeout); tv.tv_usec = (int)apr_time_usec(sock->timeout); tvptr = &tv; } rc = select(FD_SETSIZE+1, NULL, &wfdset, &efdset, tvptr); is so suboptimal, it might as well be pure posix. It's obviously msvcrt select() implementation which ignores tv_usec based on the reporters comments. So where does this leave us? Just set a damned event for the completion context of connect (or WSAConnect) and block on the event with exactly the timeout you want (using [WSA]WaitForSingleObject). That should provide near-instant acknowledgment of success or failure. Because mod_ftp PORT needs the behavior, I can play with this pretty readily late in the week or at the con.