diff --git a/mongoose.c b/mongoose.c index c11daf8c..ddc506a9 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2947,11 +2947,16 @@ static struct mg_connection *alloc_conn(struct mg_mgr *mgr, bool is_client, static long mg_sock_send(struct mg_connection *c, const void *buf, size_t len) { long n; +#if defined(_WIN32) + // See #1338, #1382. On Windows, UDP send() can fail despite connected. + // Use sendto() instead. But not UNIX: e.g. on Mac we'll get EISCONN if (c->is_udp) { union usa usa; socklen_t slen = tousa(&c->peer, &usa); n = sendto(FD(c), (char *) buf, len, 0, &usa.sa, slen); - } else { + } else +#endif + { n = send(FD(c), (char *) buf, len, MSG_NONBLOCKING); } return n == 0 ? -1 : n < 0 && mg_sock_would_block() ? 0 : n; diff --git a/src/sock.c b/src/sock.c index 11ea3426..6e816d2a 100644 --- a/src/sock.c +++ b/src/sock.c @@ -102,11 +102,16 @@ static struct mg_connection *alloc_conn(struct mg_mgr *mgr, bool is_client, static long mg_sock_send(struct mg_connection *c, const void *buf, size_t len) { long n; +#if defined(_WIN32) + // See #1338, #1382. On Windows, UDP send() can fail despite connected. + // Use sendto() instead. But not UNIX: e.g. on Mac we'll get EISCONN if (c->is_udp) { union usa usa; socklen_t slen = tousa(&c->peer, &usa); n = sendto(FD(c), (char *) buf, len, 0, &usa.sa, slen); - } else { + } else +#endif + { n = send(FD(c), (char *) buf, len, MSG_NONBLOCKING); } return n == 0 ? -1 : n < 0 && mg_sock_would_block() ? 0 : n;