C – Utilisation de poll pour multiplexer entre socket (s) et stdin – Server

J’écris une application client-serveur et j’utilise poll pour multiplexer plusieurs sockets client et stdin, où je peux insérer des commandes (exemple: arrêter le serveur). Je crois que la structure (la “logique”) de mon code est correcte, mais elle ne se comporte pas comme je le souhaite:

struct pollfd pfd[NSERVER]; //defined as 10 pfd[0].fd = fileno(stdin); pfd[0].events = POLLIN; pfd[1].fd = socktfd; //server bind, listen socket pfd[1].events = POLLIN; struct sockaddr_storage remoteaddr; // client address socklen_t addrlen; char remoteIP[INET6_ADDRSTRLEN]; addrlen = sizeof remoteaddr; char buf[1024]; // buffer int pos=2; while(poll(pfd,1,0) >= 0) { if(pfd[0].revents & POLLIN) { //stdin //process input and perform command } if(pfd[1].revents & POLLIN) { /* new connection */ int connsockfd = accept(socktfd, (struct sockaddr *)&remoteaddr,&addrlen); pfd[pos].fd=connsockfd; } int i=2; //Loop through the fd in pfd for events while (i<=NSERVER) { if (pfd[i].revents & POLLIN) { int c=recv(pfd[i].fd, buf, sizeof buf, 0); if(c<=0) { if (c==0) { /* Client closed socket */ close(pfd[i].fd); } }else {//Client sent some data c=send(pfd[i].fd,sbuff,z,0); if (c<=0) { Error; } free(sbuff); } } i++; } } 

J’ai supprimé du code à l’intérieur du recv et envoyer pour le rendre plus facile à lire. Il ne se comporte pas (il se bloque, n’accepte pas les connexions ou réagit à l’entrée de stdin).

Remarque: je préférerais utiliser le sondage plutôt que sélectionner, aussi évitez de sélectionner :-).

Merci d’avance pour toute aide.

  1. vous devez définir chaque pfd[i].fd = -1 , afin qu’ils soient ignorés initialement par poll ().
  2. poll(pfd, 1, 0) est incorrect et doit au moins être poll(pfd, 2, 0) ou même poll(pfd, NSERVER, 0) .
  3. while(i<=NSERVER) devrait être while(i

Votre programme se bloque probablement, car vous parcourez le tableau de puissance surfacique qui n’est pas initialisé et qui contient des valeurs aléatoires pour .fd et .revents; Faire if(pdf[i].fd < 0) {i++; continue;} if(pdf[i].fd < 0) {i++; continue;} dans la boucle i .

Vous ne définissez pas non plus pfd[pos].events = POLLIN sur les sockets nouvellement acceptés. Ne définissez pas POLLOUT sauf si vous avez quelque chose à envoyer, car cela déclenchera presque tout le temps.