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.