Hi Hans, On 10/31/2018 02:21 PM, Hans Leidekker wrote:
+static void set_blocking( SOCKET socket, BOOL blocking ) +{ + ULONG state = !blocking; + ioctlsocket( socket, FIONBIO, &state ); +} + +static int sock_peek( SOCKET socket ) +{ + int ret; + char byte; + + set_blocking( socket, FALSE ); + ret = recv( socket, &byte, 1, MSG_PEEK ); + set_blocking( socket, TRUE ); + return ret; +} + +static int sock_recv( SOCKET socket, char *buf, int len ) +{ + int count, ret = 0; + for (;;) + { + if ((count = recv( socket, buf + ret, len, 0 )) <= 0) break; + ret += count; + len -= count; + if (sock_peek( socket ) != 1) break;
It seems to me that you don't really need sock_peek. You could just set socket to non-blocking mode after the first successful recv. Jacek