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++;
}
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");
}
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.