GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿hay una lectura o recepción desde el socket con tiempo de espera?

// 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;
}

Linux
  1. Lea y escriba datos desde cualquier lugar con redirección en la terminal de Linux

  2. Linux:¿podemos obtener información del compilador de un binario Elf?

  3. Lectura de líneas de un archivo con Bash:para vs. ¿Mientras?

  4. Cómo enviar un correo electrónico con archivo adjunto y cuerpo desde Linux

  5. ¿Hay STDCALL en Linux?

Comando de tiempo de espera de Linux explicado para principiantes (con ejemplos)

Cómo compartir archivos de forma segura desde la línea de comandos con ffsend en Linux

Lea libros electrónicos desde la línea de comandos con Epy Ebook Reader

Consejos de Vim:lea y escriba archivos remotos con Vim en Linux

Trabajar con Microsoft Exchange desde su escritorio Linux

Ponga un temporizador en sus comandos en ejecución con el comando de tiempo de espera en Linux