Index: win32/win32.c =================================================================== --- win32/win32.c (revision 26382) +++ win32/win32.c (working copy) @@ -3045,7 +3045,21 @@ }); return r; } - + +static void +socket_clear(int fd) +{ + char buf[256]; + if (fcntl(fd, F_SETFL, O_NONBLOCK) != -1) { + while ((ssize_t)rb_w32_read(fd, buf, sizeof(buf)) > 0); + } else { + struct timeval timeout = {0, 0}; + while(select(2, &fd, 0, 0, &timeout) > 0) { + rb_w32_read(fd, buf, sizeof(buf)); + } + } +} + #undef shutdown int WSAAPI @@ -3055,6 +3069,9 @@ if (!NtSocketsInitialized) { StartSockets(); } + if (how == SD_RECEIVE || how == SD_BOTH) { + socket_clear(s); + } RUBY_CRITICAL({ r = shutdown(TO_SOCKET(s), how); if (r == SOCKET_ERROR) @@ -4804,6 +4821,7 @@ UnlockFile((HANDLE)sock, 0, 0, LK_LEN, LK_LEN); return _close(fd); } + socket_clear(fd); _set_osfhnd(fd, (SOCKET)INVALID_HANDLE_VALUE); key = (st_data_t)sock; st_delete(socklist, &key, NULL);