diff Modules/socketmodule.c @ 27981:eb2a984d3747 legacy-trunk

The connect timeout code wasn't working on Windows. 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).
author Guido van Rossum <guido@python.org>
date Wed, 19 Feb 2003 17:50:16 +0000
parents f8440bb8ede5
children 871da703e4c0
line wrap: on
line diff
--- a/Modules/socketmodule.c	Wed Feb 19 16:34:11 2003 +0000
+++ b/Modules/socketmodule.c	Wed Feb 19 17:50:16 2003 +0000
@@ -1336,18 +1336,19 @@
 
 	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 */
 		}
 	}