UDP Socket Set Timeout

j'essaie de régler un délai de 100ms sur un Socket UDP. J'utilise C. j'ai posté des morceaux relavent de mon code ci-dessous. Je ne suis pas sûr pourquoi ce n'est pas le timing, mais pend juste quand il ne reçoit pas un segment. Cela ne fonctionne-t-il que sur les sockets qui ne sont pas liés par la méthode 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 %dn", seq_num);
    num_timeouts++;
}
24
demandé sur rharrison33 2012-11-25 06:21:26

2 réponses

SO_RCVTIMEO option attend un struct timeval définie dans sys/time.h, pas un entier comme vous lui passez. timeval struct a comme champ pour les secondes et un champ de microsecondes. Pour régler le timeout à 100ms, voici ce qui devrait faire l'affaire:

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");
}
43
répondu Neal 2014-10-11 12:33:48

j'ai le même problème. J'ai essayé d'adopter la solution que vous avez suggérée, en utilisant le timeval struct. Mais il n'a pas l'air de fonctionner.

j'ai lu sur la documentation de Microsoft et le temps devrait être un DWORD avec le nombre de millisecondes, mais il y a aussi une autre chose à faire, si la socket est créée en utilisant le WSASocket fonction, puis le dwFlags paramètre doit avoir la WSA_FLAG_OVERLAPPED attribut défini pour que le timeout fonctionne correctement. Sinon, le délai ne prend jamais effet.

0
répondu user9510357 2018-03-18 01:26:49