Puede utilizar la función setsockopt para establecer un tiempo de espera en las operaciones de recepción:
SO_RCVTIMEO
Establece el valor de tiempo de espera que especifica la cantidad máxima de tiempo que espera una función de entrada hasta que se completa. Acepta una estructura de valores de tiempo con la cantidad de segundos y microsegundos que especifican el límite de cuánto tiempo esperar para que se complete una operación de entrada. Si una operación de recepción se ha bloqueado durante tanto tiempo sin recibir datos adicionales, volverá con un recuento parcial o errno establecido en [EAGAIN] o [EWOULDBLOCK] si no se reciben datos. El valor predeterminado para esta opción es cero, lo que indica que una operación de recepción no se agotará. Esta opción tiene una estructura de tiempo. Tenga en cuenta que no todas las implementaciones permiten configurar esta opción.
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
// WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
// MAC OS X (identical to Linux)
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
Según se informa, en Windows, esto debe hacerse antes de llamar bind
. He verificado mediante un experimento que se puede hacer antes o después bind
en Linux y OS X.