diff options
author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2004-05-28 07:24:43 +0000 |
---|---|---|
committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2004-05-28 07:24:43 +0000 |
commit | c98dc991998c724a3f6a1fdd90b5d1d8a80e3af3 (patch) | |
tree | 8d8b8aa856d8a3e822121d0915a63b8244f471bb /src | |
parent | 9297b074d53a00e1149250e0bbfa0871dcc5558f (diff) | |
download | luasocket-c98dc991998c724a3f6a1fdd90b5d1d8a80e3af3.tar.gz luasocket-c98dc991998c724a3f6a1fdd90b5d1d8a80e3af3.tar.bz2 luasocket-c98dc991998c724a3f6a1fdd90b5d1d8a80e3af3.zip |
Bug feioso no UDP e possivelmente no TCP também.
Diffstat (limited to 'src')
-rw-r--r-- | src/udp.c | 12 | ||||
-rw-r--r-- | src/usocket.c | 8 | ||||
-rw-r--r-- | src/wsocket.c | 21 |
3 files changed, 18 insertions, 23 deletions
@@ -109,7 +109,8 @@ static int meth_send(lua_State *L) | |||
109 | int err; | 109 | int err; |
110 | const char *data = luaL_checklstring(L, 2, &count); | 110 | const char *data = luaL_checklstring(L, 2, &count); |
111 | tm_markstart(tm); | 111 | tm_markstart(tm); |
112 | err = sock_send(&udp->sock, data, count, &sent, tm_get(tm)); | 112 | do err = sock_send(&udp->sock, data, count, &sent, tm_getretry(tm)); |
113 | while (err == IO_RETRY); | ||
113 | if (err == IO_DONE) lua_pushnumber(L, sent); | 114 | if (err == IO_DONE) lua_pushnumber(L, sent); |
114 | else lua_pushnil(L); | 115 | else lua_pushnil(L); |
115 | /* a 'closed' error on an unconnected means the target address was not | 116 | /* a 'closed' error on an unconnected means the target address was not |
@@ -137,8 +138,9 @@ static int meth_sendto(lua_State *L) | |||
137 | addr.sin_family = AF_INET; | 138 | addr.sin_family = AF_INET; |
138 | addr.sin_port = htons(port); | 139 | addr.sin_port = htons(port); |
139 | tm_markstart(tm); | 140 | tm_markstart(tm); |
140 | err = sock_sendto(&udp->sock, data, count, &sent, | 141 | do err = sock_sendto(&udp->sock, data, count, &sent, |
141 | (SA *) &addr, sizeof(addr), tm_get(tm)); | 142 | (SA *) &addr, sizeof(addr), tm_get(tm)); |
143 | while (err == IO_RETRY); | ||
142 | if (err == IO_DONE) lua_pushnumber(L, sent); | 144 | if (err == IO_DONE) lua_pushnumber(L, sent); |
143 | else lua_pushnil(L); | 145 | else lua_pushnil(L); |
144 | /* a 'closed' error on an unconnected means the target address was not | 146 | /* a 'closed' error on an unconnected means the target address was not |
@@ -159,7 +161,8 @@ static int meth_receive(lua_State *L) | |||
159 | p_tm tm = &udp->tm; | 161 | p_tm tm = &udp->tm; |
160 | count = MIN(count, sizeof(buffer)); | 162 | count = MIN(count, sizeof(buffer)); |
161 | tm_markstart(tm); | 163 | tm_markstart(tm); |
162 | err = sock_recv(&udp->sock, buffer, count, &got, tm_get(tm)); | 164 | do err = sock_recv(&udp->sock, buffer, count, &got, tm_get(tm)); |
165 | while (err == IO_RETRY); | ||
163 | if (err == IO_DONE) lua_pushlstring(L, buffer, got); | 166 | if (err == IO_DONE) lua_pushlstring(L, buffer, got); |
164 | else lua_pushnil(L); | 167 | else lua_pushnil(L); |
165 | io_pusherror(L, err); | 168 | io_pusherror(L, err); |
@@ -180,8 +183,9 @@ static int meth_receivefrom(lua_State *L) | |||
180 | p_tm tm = &udp->tm; | 183 | p_tm tm = &udp->tm; |
181 | tm_markstart(tm); | 184 | tm_markstart(tm); |
182 | count = MIN(count, sizeof(buffer)); | 185 | count = MIN(count, sizeof(buffer)); |
183 | err = sock_recvfrom(&udp->sock, buffer, count, &got, | 186 | do err = sock_recvfrom(&udp->sock, buffer, count, &got, |
184 | (SA *) &addr, &addr_len, tm_get(tm)); | 187 | (SA *) &addr, &addr_len, tm_get(tm)); |
188 | while (err == IO_RETRY); | ||
185 | if (err == IO_DONE) { | 189 | if (err == IO_DONE) { |
186 | lua_pushlstring(L, buffer, got); | 190 | lua_pushlstring(L, buffer, got); |
187 | lua_pushstring(L, inet_ntoa(addr.sin_addr)); | 191 | lua_pushstring(L, inet_ntoa(addr.sin_addr)); |
diff --git a/src/usocket.c b/src/usocket.c index eb1a49a..9e6efd3 100644 --- a/src/usocket.c +++ b/src/usocket.c | |||
@@ -211,7 +211,7 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, | |||
211 | /* here there was no data before timeout */ | 211 | /* here there was no data before timeout */ |
212 | else return IO_TIMEOUT; | 212 | else return IO_TIMEOUT; |
213 | /* here we didn't send anything, but now we can */ | 213 | /* here we didn't send anything, but now we can */ |
214 | } else return IO_DONE; | 214 | } else return IO_RETRY; |
215 | /* here we successfully sent something */ | 215 | /* here we successfully sent something */ |
216 | } else { | 216 | } else { |
217 | *sent = put; | 217 | *sent = put; |
@@ -239,7 +239,7 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, | |||
239 | if (sock_select(sock+1, NULL, &fds, NULL, timeout) <= 0) { | 239 | if (sock_select(sock+1, NULL, &fds, NULL, timeout) <= 0) { |
240 | if (errno == EINTR) return IO_RETRY; | 240 | if (errno == EINTR) return IO_RETRY; |
241 | else return IO_TIMEOUT; | 241 | else return IO_TIMEOUT; |
242 | } else return IO_DONE; | 242 | } else return IO_RETRY; |
243 | } else { | 243 | } else { |
244 | *sent = put; | 244 | *sent = put; |
245 | return IO_DONE; | 245 | return IO_DONE; |
@@ -266,7 +266,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout) | |||
266 | ret = sock_select(sock+1, &fds, NULL, NULL, timeout); | 266 | ret = sock_select(sock+1, &fds, NULL, NULL, timeout); |
267 | if (ret < 0 && errno == EINTR) return IO_RETRY; | 267 | if (ret < 0 && errno == EINTR) return IO_RETRY; |
268 | if (ret == 0) return IO_TIMEOUT; | 268 | if (ret == 0) return IO_TIMEOUT; |
269 | else return IO_DONE; | 269 | return IO_RETRY; |
270 | } else { | 270 | } else { |
271 | *got = taken; | 271 | *got = taken; |
272 | return IO_DONE; | 272 | return IO_DONE; |
@@ -294,7 +294,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, | |||
294 | ret = sock_select(sock+1, &fds, NULL, NULL, timeout); | 294 | ret = sock_select(sock+1, &fds, NULL, NULL, timeout); |
295 | if (ret < 0 && errno == EINTR) return IO_RETRY; | 295 | if (ret < 0 && errno == EINTR) return IO_RETRY; |
296 | if (ret == 0) return IO_TIMEOUT; | 296 | if (ret == 0) return IO_TIMEOUT; |
297 | else return IO_DONE; | 297 | return IO_RETRY; |
298 | } else { | 298 | } else { |
299 | *got = taken; | 299 | *got = taken; |
300 | return IO_DONE; | 300 | return IO_DONE; |
diff --git a/src/wsocket.c b/src/wsocket.c index af3f8d8..023f470 100644 --- a/src/wsocket.c +++ b/src/wsocket.c | |||
@@ -207,9 +207,9 @@ int sock_send(p_sock ps, const char *data, size_t count, size_t *sent, | |||
207 | FD_ZERO(&fds); | 207 | FD_ZERO(&fds); |
208 | FD_SET(sock, &fds); | 208 | FD_SET(sock, &fds); |
209 | ret = sock_select(0, NULL, &fds, NULL, timeout); | 209 | ret = sock_select(0, NULL, &fds, NULL, timeout); |
210 | /* tell the caller to call us again because there is more data */ | 210 | /* tell the caller to call us again because now we can send */ |
211 | if (ret > 0) return IO_DONE; | 211 | if (ret > 0) return IO_RETRY; |
212 | /* tell the caller there was no data before timeout */ | 212 | /* tell the caller we can't send anything before timint out */ |
213 | else return IO_TIMEOUT; | 213 | else return IO_TIMEOUT; |
214 | /* here we know the connection has been closed */ | 214 | /* here we know the connection has been closed */ |
215 | } else return IO_CLOSED; | 215 | } else return IO_CLOSED; |
@@ -229,27 +229,18 @@ int sock_sendto(p_sock ps, const char *data, size_t count, size_t *sent, | |||
229 | t_sock sock = *ps; | 229 | t_sock sock = *ps; |
230 | int put; | 230 | int put; |
231 | int ret; | 231 | int ret; |
232 | /* avoid making system calls on closed sockets */ | ||
233 | if (sock == SOCK_INVALID) return IO_CLOSED; | 232 | if (sock == SOCK_INVALID) return IO_CLOSED; |
234 | /* try to send something */ | ||
235 | put = sendto(sock, data, (int) count, 0, addr, addr_len); | 233 | put = sendto(sock, data, (int) count, 0, addr, addr_len); |
236 | /* deal with failure */ | ||
237 | if (put <= 0) { | 234 | if (put <= 0) { |
238 | /* in any case, nothing has been sent */ | ||
239 | *sent = 0; | 235 | *sent = 0; |
240 | /* run select to avoid busy wait */ | ||
241 | if (WSAGetLastError() == WSAEWOULDBLOCK) { | 236 | if (WSAGetLastError() == WSAEWOULDBLOCK) { |
242 | fd_set fds; | 237 | fd_set fds; |
243 | FD_ZERO(&fds); | 238 | FD_ZERO(&fds); |
244 | FD_SET(sock, &fds); | 239 | FD_SET(sock, &fds); |
245 | ret = sock_select(0, NULL, &fds, NULL, timeout); | 240 | ret = sock_select(0, NULL, &fds, NULL, timeout); |
246 | /* tell the caller to call us again because there is more data */ | 241 | if (ret > 0) return IO_RETRY; |
247 | if (ret > 0) return IO_DONE; | ||
248 | /* tell the caller there was no data before timeout */ | ||
249 | else return IO_TIMEOUT; | 242 | else return IO_TIMEOUT; |
250 | /* here we know the connection has been closed */ | ||
251 | } else return IO_CLOSED; | 243 | } else return IO_CLOSED; |
252 | /* here we successfully sent something */ | ||
253 | } else { | 244 | } else { |
254 | *sent = put; | 245 | *sent = put; |
255 | return IO_DONE; | 246 | return IO_DONE; |
@@ -273,7 +264,7 @@ int sock_recv(p_sock ps, char *data, size_t count, size_t *got, int timeout) | |||
273 | FD_ZERO(&fds); | 264 | FD_ZERO(&fds); |
274 | FD_SET(sock, &fds); | 265 | FD_SET(sock, &fds); |
275 | ret = sock_select(0, &fds, NULL, NULL, timeout); | 266 | ret = sock_select(0, &fds, NULL, NULL, timeout); |
276 | if (ret > 0) return IO_DONE; | 267 | if (ret > 0) return IO_RETRY; |
277 | else return IO_TIMEOUT; | 268 | else return IO_TIMEOUT; |
278 | } else { | 269 | } else { |
279 | *got = taken; | 270 | *got = taken; |
@@ -299,7 +290,7 @@ int sock_recvfrom(p_sock ps, char *data, size_t count, size_t *got, | |||
299 | FD_ZERO(&fds); | 290 | FD_ZERO(&fds); |
300 | FD_SET(sock, &fds); | 291 | FD_SET(sock, &fds); |
301 | ret = sock_select(0, &fds, NULL, NULL, timeout); | 292 | ret = sock_select(0, &fds, NULL, NULL, timeout); |
302 | if (ret > 0) return IO_DONE; | 293 | if (ret > 0) return IO_RETRY; |
303 | else return IO_TIMEOUT; | 294 | else return IO_TIMEOUT; |
304 | } else { | 295 | } else { |
305 | *got = taken; | 296 | *got = taken; |