c udp socket non bloquant avec recvfrom et sélectionnez
Je veux mettre en œuvre côté client socket non bloquant avec fonction de sélection. Mais il ne fonctionne pas comme prévu. Dans le code ci-dessous, il n'est jamais en reste , rv est toujours 1 et lorsque rien n'est sur la prise, l'application s'arrête un moment et continuer quand un autre des messages est sur le socket. Je ne veux pas que le comportement , je veux que le client envoie un message au serveur quand il n'y a rien sur la prise de recvfrom.
fd_set readfds;
fcntl(sd, F_SETFL, O_NONBLOCK);
while (1) {
FD_ZERO(&readfds);
FD_SET(sd, &readfds);
rv = select(sd + 1, &readfds, NULL, NULL, NULL);
if(rv == 1){
nbytes = recvfrom(sd, buf, RW_SIZE, 0, (struct sockaddr *) &srv_addr, &addrlen);
} else {
printf("I'm never here so I can't send message back to the server!\n");
}
}
avec struct timeval:
fd_set readfds;
fcntl(sd, F_SETFL, O_NONBLOCK);
struct timeval tv;
while (1) {
FD_ZERO(&readfds);
FD_SET(sd, &readfds);
tv.tv_sec = 0;
tv.tv_usec = 0;
rv = select(sd + 1, &readfds, NULL, NULL, &tv);
if(rv == 1){
nbytes = recvfrom(sd, buf, RW_SIZE, 0, (struct sockaddr *) &srv_addr, &addrlen);
} else {
printf("I'm always here like now ! \n");
}
}
- Êtes-vous vérifier si
fcntl
appel est un succès et O_NONBLOCK est disponible dans votre système? - oui, j'ai vérifié si fcntl renvoie -1 et il n'est pas le cas, elle renvoie 0
Vous devez vous connecter pour publier un commentaire.
Vous définissez le délai d'attente (dernier paramètre de sélection) à NULL, ce qui signifie qu'il ne reviendra que lorsque des données sont disponibles sur la prise (ou interruption). Vous avez besoin de définir un délai d'attente, il faut attendre. Le délai d'attente peut être 0 si vous ne voulez pas attendre, mais de 0 signifie que l'utilisation d'un
struct timeval*
avectv_sec=0
ettv_usec=0
et de ne pas utiliserstruct timeval*
NULL comme vous l'avez fait.rv==1
, mais à cause de votre zéro délai d'attente de disponibilité de 99,999% de tous les cas seront tout simplement rien. Je ne suis pas sûr de ce que vous essayez d'atteindre avec cette conception. Habituellement, un programme d'installation avec les sélectionner et les non-bloquant qui est utilisé pour gérer les prises multiples ou attendre que les données avec un sensible (non-nulle) délai d'attente.