paramètre de délai d'attente pour recv fcn d'une socket UDP
- Je envoyer un paquet UDP par sendto
, puis de recevoir la réponse par recv
.si recv
ne reçoit pas de réponse, le programme ne se déroule pas. Cependant, le paquet udp peuvent être perdus, ou pour une raison quelconque, le paquet ne peut pas être livré, de sorte que le programme reste bloqué sur recv
ligne. Je me demande comment est-il possible de définir un délai d'attente pour recv
si nopacket arrive ,par exemple, une minute, puis sauter la ligne et passer le code?
Je ne suis pas coller le code complet car c'est un générique udp
code et ma question est liée à la seule recv
. Pour la note finale, l'environnement de développement de linux.
unsigned long buf[maxlen];
struct protoent *proto; //
struct sockaddr_in server_addr;
int s; //socket
memset( &server_addr, 0, sizeof( server_addr ));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr = inet_addr(hostname);
sendto(s,msg,sizeof(msg),0,(struct sockaddr *)&server_addr,sizeof(server_addr));
recv(s,buf,sizeof(buf),0);
Faire le socket non bloquant? Ou d'utiliser, par exemple,
select
pour l'interrogation? Et bien sûr il y a le MSG_DONTWAIT
drapeau pour recv
(ce qui est spécifique à Linux extension).OriginalL'auteur sven | 2013-04-23
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
poll
ouselect
ou quelque chose de similaire:OriginalL'auteur Valeri Atamaniouk
Comment définir le délai d'attente pour la socket UDP dans Linux:
errno
pourEAGAIN/EWOULDBLOCK
pour déterminer si un délai d'attente qui s'est passé.OriginalL'auteur shippo7
Appel
setsockopt()
avec leSO_RCVTIMEO
option.OriginalL'auteur user207421