From: mtewoodbury@gmail.com Subject: [PATCH 2/2] Quickly retry sendmsg or recvmsg if errno is EAGAIN or EINTR. Message-Id: <1393029319-10014-1-git-send-email-mtewoodbury@gmail.com> Date: Fri, 21 Feb 2014 19:35:19 -0500 From: Max TenEyck Woodbury Note that this greatly improves network reliability. --- dlls/ws2_32/socket.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 2a2c809..22f2056 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -1921,7 +1921,11 @@ static int WS2_recv( int fd, struct ws2_async *wsa ) hdr.msg_flags = 0; #endif - if ( (n = recvmsg(fd, &hdr, wsa->flags)) == -1 ) + n = recvmsg(fd, &hdr, wsa->flags); + if (n == -1 && (errno == EINTR || errno == EAGAIN)) + n = recvmsg(fd, &hdr, wsa->flags); + if (n == -1) + return -1; #ifdef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS @@ -2173,8 +2177,9 @@ static int WS2_send( int fd, struct ws2_async *wsa ) #endif ret = sendmsg(fd, &hdr, wsa->flags); - if (ret >= 0) - { + if (ret == -1 && (errno == EINTR || errno == EAGAIN)) + ret = sendmsg(fd, &hdr, wsa->flags); /* Try it again quickly */ + if (ret >= 0) { n = ret; while (wsa->first_iovec < wsa->n_iovecs && wsa->iovec[wsa->first_iovec].iov_len <= n) n -= wsa->iovec[wsa->first_iovec++].iov_len; -- 1.8.0.rc0.18.gf84667d