]> granicus.if.org Git - python/commitdiff
The connect timeout code wasn't working on Windows.
authorGuido van Rossum <guido@python.org>
Wed, 19 Feb 2003 17:50:16 +0000 (17:50 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 19 Feb 2003 17:50:16 +0000 (17:50 +0000)
Rather than trying to second-guess the various error returns
of a second connect(), use select() to determine whether the
socket becomes writable (which means connected).

Modules/socketmodule.c

index 1b3321f5d052f1db17d7926fd039942b21c69bd6..2b8e3ea51f89ba9b6769101d2493e1bcecff5177 100644 (file)
@@ -1336,18 +1336,19 @@ internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen)
 
        if (s->sock_timeout > 0.0) {
                if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK) {
-                       internal_select(s, 1);
-                       res = connect(s->sock_fd, addr, addrlen);
-                       if (res < 0) {
-                               /* On Win98, WSAEISCONN was seen here.  But
-                                * on Win2K, WSAEINVAL.  So accept both as
-                                * meaning "fine".
-                                */
-                               int code = WSAGetLastError();
-                               if (code == WSAEISCONN ||
-                                   code == WSAEINVAL)
-                                       res = 0;
-                       }
+                       /* This is a mess.  Best solution: trust select */
+                       fd_set fds;
+                       struct timeval tv;
+                       tv.tv_sec = (int)s->sock_timeout;
+                       tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);
+                       FD_ZERO(&fds);
+                       FD_SET(s->sock_fd, &fds);
+                       res = select(s->sock_fd+1, NULL, &fds, NULL, &tv);
+                       if (res == 0)
+                               res = WSAEWOULDBLOCK;
+                       else if (res > 0)
+                               res = 0;
+                       /* else if (res < 0) an error occurred */
                }
        }