El tiempo de espera establecido por setsockopt en la programación de sockets en lenguaje C no es válido para lectura.
No uses lectura, intenta usar la función recv() para recibir en su lugar.
Si realmente no funciona, configure el socket en modo sin bloqueo desde el principio:
u_long mode = 1;
ioctlsocket(fd, FIONBIO,&modo);