Tiempo de espera de conjunto de sockets UDP

2 minutos de lectura

Estoy tratando de establecer un tiempo de espera de 100 ms en un socket UDP. Estoy usando C. He publicado partes relevantes de mi código a continuación. No estoy seguro de por qué no se agota el tiempo de espera, sino que simplemente se cuelga cuando no recibe un segmento. ¿Esto solo funciona en sockets que no están vinculados mediante el método bind()?

#define TIMEOUT_MS      100     /* Seconds between retransmits */

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    DieWithError("socket() failed");

if ((rcv_sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
    DieWithError("socket() failed");

//set timer for recv_socket
static int timeout = TIMEOUT_MS;
setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));

if(recvfrom(rcv_sock, ackBuffer,sizeof(ackBuffer), 0,
       (struct sockaddr *) &servAddr2, &fromSize) < 0){
    //timeout reached
    printf("Timout reached. Resending segment %d\n", seq_num);
    num_timeouts++;
}

  • Parece que no está comprobando el valor de retorno de setsockopt para ver si devuelve un error. Probablemente lo sea. SO_RCVTIMEO está documentado tanto en Linux como en MacOS para tomar una struct timevalpero estás pasando un int. Prueba a pasar un struct timeval en lugar de. Además, ¿por qué estás lanzando &timeout para char *? No es un char * en absoluto.

    – Celada

    25 de noviembre de 2012 a las 2:52

Tiempo de espera de conjunto de sockets UDP
Neal

los SO_RCVTIMEO opción espera un struct timeval definido en sys/time.h, no un número entero como si le estuvieras pasando. los timeval struct tiene como campo para segundos y un campo para microsegundos. Para establecer el tiempo de espera en 100 ms, lo siguiente debería funcionar:

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 100000;
if (setsockopt(rcv_sock, SOL_SOCKET, SO_RCVTIMEO,&tv,sizeof(tv)) < 0) {
    perror("Error");
}

Tiempo de espera de conjunto de sockets UDP
usuario9510357

Tengo el mismo problema. Traté de adoptar la solución que sugirió, usando el timeval estructura Pero no pareció funcionar.

He leído en la documentación de Microsoft y el tiempo debe ser un DWORD con la cantidad de milisegundos, pero también hay otra cosa que hacer, si el socket se crea usando el WSASocket función, entonces la dwFlags parámetro debe tener el WSA_FLAG_OVERLAPPED conjunto de atributos para que el tiempo de espera funcione correctamente. De lo contrario, el tiempo de espera nunca tendrá efecto.

  • La respuesta aceptada se dirige a los sockets POSIX. Windows proporciona su propia API de socket, por lo que la respuesta aceptada no se aplica a Windows.

    – b00n12

    4 de febrero de 2020 a las 7:47

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad