Tengo que construir un sistema de red UDP bilateral, lo que significa que tanto el servidor como el cliente envían y reciben datos, como se ilustra en el siguiente diagrama:

Tomé un ejemplo listo para usar de http://www.binarytides.com/udp-socket-programming-in-winsock/
Sin embargo, en el cliente, cuando se envía una cadena de datos, el cliente se atasca esperando datos entrantes en esta línea: recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)
El cliente no puede enviar más datos hasta que reciba datos entrantes.
¿Hay algún método en el que pueda seguir enviando datos al servidor, mientras también espero los datos entrantes?
Esto se debe a que, de manera predeterminada, los sockets se bloquean, lo que significa que las llamadas familiares recv y read se bloquearán hasta que haya datos disponibles. Debe usar E/S sin bloqueo con multiplexación como select() o poll() , o usar un subproceso dedicado separado para recibir datos.
La E/S sin bloqueo tiene un diseño significativamente diferente al código de E/S con bloqueo, por lo que no hay un cambio simple que pueda hacer. Le recomiendo que lea algo como la Guía de programación de redes de Beej, que cubre todos estos temas.