- /* Signal a close on the socket. */
- return s->receiver(s, 0, NULL, 0);
- break;
+ /* Signal a close on the socket. First read any outstanding data. */
+ open = 1;
+ do {
+ ret = recv(s->s, buf, sizeof(buf), 0);
+ if (ret < 0) {
+ err = WSAGetLastError();
+ if (err == WSAEWOULDBLOCK)
+ break;
+ return s->receiver(s, 3, winsock_error_string(err), err);
+ } else
+ open &= s->receiver(s, 0, buf, ret);
+ } while (ret > 0);
+ return open;