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 unastruct timeval
pero estás pasando unint
. Prueba a pasar unstruct timeval
en lugar de. Además, ¿por qué estás lanzando&timeout
parachar *
? No es unchar *
en absoluto.– Celada
25 de noviembre de 2012 a las 2:52