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
InformationsquelleAutor user3852803 | 2014-08-16