diff options
author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2005-03-11 00:20:21 +0000 |
---|---|---|
committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2005-03-11 00:20:21 +0000 |
commit | e57f9e9964ac16b1fd09028ea533457f3029d296 (patch) | |
tree | c500d0de9381444ddfc96985b329e7a254cd1a59 /src/wsocket.c | |
parent | 63e3d7c5b0886a4243dd426b2a9f58d2173b26cf (diff) | |
download | luasocket-e57f9e9964ac16b1fd09028ea533457f3029d296.tar.gz luasocket-e57f9e9964ac16b1fd09028ea533457f3029d296.tar.bz2 luasocket-e57f9e9964ac16b1fd09028ea533457f3029d296.zip |
Apparently, non-blocking connect doesn't work on windows if you use 0
timeout in the select call...
Diffstat (limited to 'src/wsocket.c')
-rw-r--r-- | src/wsocket.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/wsocket.c b/src/wsocket.c index c0686cd..8b00fa5 100644 --- a/src/wsocket.c +++ b/src/wsocket.c | |||
@@ -45,15 +45,15 @@ int sock_close(void) { | |||
45 | #define WAITFD_E 4 | 45 | #define WAITFD_E 4 |
46 | #define WAITFD_C (WAITFD_E|WAITFD_W) | 46 | #define WAITFD_C (WAITFD_E|WAITFD_W) |
47 | 47 | ||
48 | int sock_waitfd(t_sock fd, int sw, p_tm tm) { | 48 | int sock_waitfd(p_sock ps, int sw, p_tm tm) { |
49 | int ret; | 49 | int ret; |
50 | fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL; | 50 | fd_set rfds, wfds, efds, *rp = NULL, *wp = NULL, *ep = NULL; |
51 | struct timeval tv, *tp = NULL; | 51 | struct timeval tv, *tp = NULL; |
52 | double t; | 52 | double t; |
53 | if (tm_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ | 53 | if (tm_iszero(tm)) return IO_TIMEOUT; /* optimize timeout == 0 case */ |
54 | if (sw & WAITFD_R) { FD_ZERO(&rfds); FD_SET(fd, &rfds); rp = &rfds; } | 54 | if (sw & WAITFD_R) { FD_ZERO(&rfds); FD_SET(*ps, &rfds); rp = &rfds; } |
55 | if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(fd, &wfds); wp = &wfds; } | 55 | if (sw & WAITFD_W) { FD_ZERO(&wfds); FD_SET(*ps, &wfds); wp = &wfds; } |
56 | if (sw & WAITFD_C) { FD_ZERO(&efds); FD_SET(fd, &efds); ep = &efds; } | 56 | if (sw & WAITFD_C) { FD_ZERO(&efds); FD_SET(*ps, &efds); ep = &efds; } |
57 | if ((t = tm_get(tm)) >= 0.0) { | 57 | if ((t = tm_get(tm)) >= 0.0) { |
58 | tv.tv_sec = (int) t; | 58 | tv.tv_sec = (int) t; |
59 | tv.tv_usec = (int) ((t-tv.tv_sec)*1.0e6); | 59 | tv.tv_usec = (int) ((t-tv.tv_sec)*1.0e6); |
@@ -62,7 +62,7 @@ int sock_waitfd(t_sock fd, int sw, p_tm tm) { | |||
62 | ret = select(0, rp, wp, ep, tp); | 62 | ret = select(0, rp, wp, ep, tp); |
63 | if (ret == -1) return WSAGetLastError(); | 63 | if (ret == -1) return WSAGetLastError(); |
64 | if (ret == 0) return IO_TIMEOUT; | 64 | if (ret == 0) return IO_TIMEOUT; |
65 | if (sw == WAITFD_C && FD_ISSET(fd, &efds)) return IO_CLOSED; | 65 | if (sw == WAITFD_C && FD_ISSET(*ps, &efds)) return IO_CLOSED; |
66 | return IO_DONE; | 66 | return IO_DONE; |
67 | } | 67 | } |
68 | 68 | ||
@@ -127,15 +127,15 @@ int sock_connect(p_sock ps, SA *addr, socklen_t len, p_tm tm) { | |||
127 | /*-------------------------------------------------------------------------*\ | 127 | /*-------------------------------------------------------------------------*\ |
128 | * Check if socket is connected | 128 | * Check if socket is connected |
129 | \*-------------------------------------------------------------------------*/ | 129 | \*-------------------------------------------------------------------------*/ |
130 | int sock_connected(p_sock ps) { | 130 | int sock_connected(p_sock ps, p_tm tm) { |
131 | int err; | 131 | int err; |
132 | if ((err = sock_waitfd(*ps, WAITFD_C, tm)) == IO_CLOSED) { | 132 | if ((err = sock_waitfd(ps, WAITFD_C, tm)) == IO_CLOSED) { |
133 | int len = sizeof(err); | 133 | int len = sizeof(err); |
134 | /* give windows time to set the error (yes, disgusting) */ | 134 | /* give windows time to set the error (yes, disgusting) */ |
135 | Sleep(0); | 135 | Sleep(0); |
136 | /* find out why we failed */ | 136 | /* find out why we failed */ |
137 | getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len); | 137 | getsockopt(*ps, SOL_SOCKET, SO_ERROR, (char *)&err, &len); |
138 | /* we KNOW there was an error. if why is 0, we will return | 138 | /* we KNOW there was an error. if 'why' is 0, we will return |
139 | * "unknown error", but it's not really our fault */ | 139 | * "unknown error", but it's not really our fault */ |
140 | return err > 0? err: IO_UNKNOWN; | 140 | return err > 0? err: IO_UNKNOWN; |
141 | } else return err; | 141 | } else return err; |
@@ -181,7 +181,7 @@ int sock_accept(p_sock ps, p_sock pa, SA *addr, socklen_t *len, p_tm tm) { | |||
181 | /* if we failed because there was no connectoin, keep trying */ | 181 | /* if we failed because there was no connectoin, keep trying */ |
182 | if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) return err; | 182 | if (err != WSAEWOULDBLOCK && err != WSAECONNABORTED) return err; |
183 | /* call select to avoid busy wait */ | 183 | /* call select to avoid busy wait */ |
184 | if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; | 184 | if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; |
185 | } | 185 | } |
186 | /* can't reach here */ | 186 | /* can't reach here */ |
187 | return IO_UNKNOWN; | 187 | return IO_UNKNOWN; |
@@ -213,7 +213,7 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, p_tm tm) | |||
213 | /* we can only proceed if there was no serious error */ | 213 | /* we can only proceed if there was no serious error */ |
214 | if (err != WSAEWOULDBLOCK) return err; | 214 | if (err != WSAEWOULDBLOCK) return err; |
215 | /* avoid busy wait */ | 215 | /* avoid busy wait */ |
216 | if ((err = sock_waitfd(*ps, WAITFD_W, tm)) != IO_DONE) return err; | 216 | if ((err = sock_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err; |
217 | } | 217 | } |
218 | /* can't reach here */ | 218 | /* can't reach here */ |
219 | return IO_UNKNOWN; | 219 | return IO_UNKNOWN; |
@@ -236,7 +236,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, | |||
236 | } | 236 | } |
237 | err = WSAGetLastError(); | 237 | err = WSAGetLastError(); |
238 | if (err != WSAEWOULDBLOCK) return err; | 238 | if (err != WSAEWOULDBLOCK) return err; |
239 | if ((err = sock_waitfd(*ps, WAITFD_W, tm)) != IO_DONE) return err; | 239 | if ((err = sock_waitfd(ps, WAITFD_W, tm)) != IO_DONE) return err; |
240 | } | 240 | } |
241 | return IO_UNKNOWN; | 241 | return IO_UNKNOWN; |
242 | } | 242 | } |
@@ -257,7 +257,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, p_tm tm) { | |||
257 | if (taken == 0) return IO_CLOSED; | 257 | if (taken == 0) return IO_CLOSED; |
258 | err = WSAGetLastError(); | 258 | err = WSAGetLastError(); |
259 | if (err != WSAEWOULDBLOCK) return err; | 259 | if (err != WSAEWOULDBLOCK) return err; |
260 | if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; | 260 | if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; |
261 | } | 261 | } |
262 | return IO_UNKNOWN; | 262 | return IO_UNKNOWN; |
263 | } | 263 | } |
@@ -279,7 +279,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, | |||
279 | if (taken == 0) return IO_CLOSED; | 279 | if (taken == 0) return IO_CLOSED; |
280 | err = WSAGetLastError(); | 280 | err = WSAGetLastError(); |
281 | if (err != WSAEWOULDBLOCK) return err; | 281 | if (err != WSAEWOULDBLOCK) return err; |
282 | if ((err = sock_waitfd(*ps, WAITFD_R, tm)) != IO_DONE) return err; | 282 | if ((err = sock_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; |
283 | } | 283 | } |
284 | return IO_UNKNOWN; | 284 | return IO_UNKNOWN; |
285 | } | 285 | } |