// también funciona después de la operación de enlace para WINDOWS
DWORD timeout = timeout_in_seconds * 1000;
setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof timeout);
Puede usar 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 una función de entrada espera hasta que se completa. Acepta una estructura de valores de tiempo con el número de segundos y microsegundos que especifican el límite de tiempo de espera 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 se establecerá con error 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 debe exceder el tiempo de espera. Esta opción toma una estructura de valor de tiempo. Tenga en cuenta que no todas las implementaciones permiten establecer 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 a bind
. He verificado por experimento que se puede hacer antes o después del bind
en Linux y OS X.
Instale un controlador para SIGALRM
, luego usa alarm()
o ualarm()
antes de un bloqueo normal recv()
. Si suena la alarma, el recv()
devolverá un error con errno
establecido en EINTR
.
Aquí hay un código simple para agregar un tiempo de espera a su recv
función usando poll
en C:
struct pollfd fd;
int ret;
fd.fd = mySocket; // your socket handler
fd.events = POLLIN;
ret = poll(&fd, 1, 1000); // 1 second for timeout
switch (ret) {
case -1:
// Error
break;
case 0:
// Timeout
break;
default:
recv(mySocket,buf,sizeof(buf), 0); // get your data
break;
}