Thanks INOUE - I was going to repost it myself in a few days :) Here's the patch again in case the old one is missing / too hard to find:
======================================================================== --- apr/network_io/win32/poll.c.old Mon Mar 25 16:37:46 2002 +++ apr/network_io/win32/poll.c Mon Mar 25 16:38:53 2002 @@ -156,6 +156,9 @@ DWORD dummy; DWORD flags = MSG_PEEK; + BOOL optval; + int optlen; + /* We just want to PEEK at the data, so I am setting up a dummy WSABUF * variable here. */ @@ -164,27 +167,45 @@ if (FD_ISSET(sock->sock, aprset->read)) { revents |= APR_POLLIN; - if (WSARecv(sock->sock, &data, 1, &dummy, &flags, NULL, - NULL) == SOCKET_ERROR) { - /* This is only legit since we don't return the error */ - dummy = WSAGetLastError(); - switch (dummy) { - case WSAECONNRESET: - case WSAECONNABORTED: - case WSAESHUTDOWN: - case WSAENETRESET: { - revents ^= APR_POLLIN; - revents |= APR_POLLHUP; - break; - } - case WSAENOTSOCK: { - revents ^= APR_POLLIN; - revents |= APR_POLLNVAL; - } - default: { - revents ^= APR_POLLIN; - revents |= APR_POLLERR; + + /* Check if the socket is listening for a connection (SO_ACCEPTCONN + * is true) - if it is we just leave APR_POLLIN in revents and + * don't attempt the WSARecv, since it would return WSAENOTCONN. + */ + optlen = sizeof(optval); + getsockopt(sock->sock, SOL_SOCKET, SO_ACCEPTCONN, (char *)&optval, + &optlen); + if (!optval) { + /* The socket is not listening */ + if (WSARecv(sock->sock, &data, 1, &dummy, &flags, NULL, + NULL) == SOCKET_ERROR) { + /* This is only legit since we don't return the error */ + dummy = WSAGetLastError(); + switch (dummy) { + case WSAECONNRESET: + case WSAECONNABORTED: + case WSAESHUTDOWN: + case WSAENETRESET: { + revents ^= APR_POLLIN; + revents |= APR_POLLHUP; + break; + } + case WSAENOTSOCK: { + revents ^= APR_POLLIN; + revents |= APR_POLLNVAL; + } + default: { + revents ^= APR_POLLIN; + revents |= APR_POLLERR; + } } + } + else if ((dummy == 0) && (sock->type == SOCK_STREAM)) { + /* Zero bytes received (dummy is the number of bytes) + * from a stream socket indicates graceful shutdown. + */ + revents ^= APR_POLLIN; + revents |= APR_POLLHUP; } } } ======================================================================== bye, Saxon Druce ([EMAIL PROTECTED]) ----- Original Message ----- From: "INOUE Seiichiro" <[EMAIL PROTECTED]> To: <dev@apr.apache.org> Sent: Monday, April 22, 2002 11:31 PM Subject: Resend ([Q] apr_poll_revents_get() before apr_accept() on Windows) > Hi, > > I formerly sent a question about the issue on Subject. > For my post, Mr. Saxon showed his patch, but the patch hasn't been committed yet. > > What is goint on? > > Thanks. > > > > ----- My Original Message ----- > > From: "INOUE Seiichiro" <[EMAIL PROTECTED]> > > To: <dev@apr.apache.org> > > Sent: Monday, March 25, 2002 12:32 AM > > Subject: [Q] apr_poll_revents_get() before apr_accept() on Windows > > > Hi, > > > > > > I have a question about apr_poll_revents_get() behavior on Windows. > > > I want to check whether the socket is apr_accept()'able. > > > On Unix, I can check the socket becomes readable by apr_poll(). > > > On Windows, when I do the same thing, apr_poll_revents_get() returns > > APR_POLLERR. > > > > > > In apr_poll_revents_get(), WSARecv() causes WSAENOTCONN, > > > if the socket hasn't been apr_accept()'ed yet. > > > (Windows2000 case. I don't know other Windows.) > > > > > > I attach a sample program for an easy reproduction. > > > > > > My question is, > > > What is a proper solution? > > > libapr should take care of it, or applications should? > > > > > > Thanks in advance. > > > > > > - INOUE Seiichiro <[EMAIL PROTECTED]> > > > http://www.ariel-networks.com