Usted 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 una función de entrada espera hasta que completa. Es acepta una estructura timeval con el número de segundos y microsegundos que especifica el límite de cuánto tiempo esperar para completar una operación de entrada a . Si una operación de recepción tiene bloqueado durante este tiempo sin recibiendo datos adicionales, deberá devolver con un conteo 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 deberá exceder el tiempo de espera. Esta opción toma una estructura timeval. 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);
Reportedly en Windows esto debe hacerse antes de llamar bind
. He comprobado experimentalmente que se puede hacer antes o después de bind
en Linux y OS X.
También existe la opción de utilizar hilos :) pero las señales de rosca todavía necesitaba – osgx