}
int select_result(WPARAM wParam, LPARAM lParam) {
- int ret;
+ int ret, open;
DWORD err;
char buf[BUFFER_GRANULE];
Socket s;
try_send(s);
break;
case FD_CLOSE:
- /* 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;
}
return 1;