FD_ISSET continue à lire bien qu’il n’y ait pas de données en c

J’ai des problèmes pour écouter sur plusieurs sockets. J’ai une fonction qui écoute sur un tas de sockets mais quand je teste et envoie seulement des données sur un des sockets; La méthode FD_ISSET continue de renvoyer true pour chaque socket et aucune donnée n’est renvoyée dans la mémoire tampon pour les sockets pour lesquels je n’ai pas envoyé de données (car il n’y en a pas). J’utilise chaque socket pour envoyer et recevoir. Qu’est-ce que je fais mal ?

EDIT: Ce qui se passe, c’est que l’instruction printf imprime plusieurs fois alors qu’elle ne devrait l’imprimer qu’une seule fois, car j’ai seulement envoyé des données sur un seul socket. J’ai ajouté dans testing pour la valeur de retour de read ()> 0 et cela ne fait toujours pas le bonheur.

void receive(struct nodeData *nd, struct sockInfo *si){ char buffer[MAXBUF]; struct timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 1000; // ----Wait in select until file descriptors change---- int y = select(si->maxFD, &si->fd_read_set, NULL, NULL, &timeout); printf("ID: %d Y %d\n", nd->id, y); if (y <= 0) return; for (int i=0; i netTopo->n; i++) { /* ----Was it child i---- */ if (FD_ISSET(si->mastFD[i], &si->fd_read_set)) { read(si->mastFD[i], buffer, MAXBUF); printf("%d %d %d \n",buffer[0], buffer[1], buffer[2]); // For Testing } } } 

Vous ignorez la valeur de retour de read . EOF est une condition lisible (obligeant select à signaler le descripteur de fichier comme lisible, c’est FD_ISSET à-dire que FD_ISSET doit renvoyer true) qu’il faut détecter via read return 0. Après EOF, vous voudrez probablement fermer le descripteur de fichier et le supprimer sur.