diff options
Diffstat (limited to 'src/wsocket.c')
-rw-r--r-- | src/wsocket.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/wsocket.c b/src/wsocket.c index 65f76bc..d34724b 100644 --- a/src/wsocket.c +++ b/src/wsocket.c | |||
@@ -250,7 +250,11 @@ int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm | |||
250 | } | 250 | } |
251 | if (taken == 0) return IO_CLOSED; | 251 | if (taken == 0) return IO_CLOSED; |
252 | err = WSAGetLastError(); | 252 | err = WSAGetLastError(); |
253 | if (err != WSAEWOULDBLOCK) return err; | 253 | /* On Windows, and on UDP, a connreset simply means the |
254 | * previous send failed. On TCP, it means our socket | ||
255 | * is now useless, so the error must pass. I am | ||
256 | * hoping waitfd will still get the error. */ | ||
257 | if (err != WSAEWOULDBLOCK && err != WSAECONNRESET) return err; | ||
254 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; | 258 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; |
255 | } | 259 | } |
256 | } | 260 | } |
@@ -271,7 +275,11 @@ int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got, | |||
271 | } | 275 | } |
272 | if (taken == 0) return IO_CLOSED; | 276 | if (taken == 0) return IO_CLOSED; |
273 | err = WSAGetLastError(); | 277 | err = WSAGetLastError(); |
274 | if (err != WSAEWOULDBLOCK) return err; | 278 | /* On Windows, and on UDP, a connreset simply means the |
279 | * previous send failed. On TCP, it means our socket | ||
280 | * is now useless, so the error must pass. I am | ||
281 | * hoping waitfd will still get the error. */ | ||
282 | if (err != WSAEWOULDBLOCK && err != WSAECONNRESET) return err; | ||
275 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; | 283 | if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err; |
276 | } | 284 | } |
277 | } | 285 | } |