Question FAQ : Comment puis-je écouter sur plus d’une socket à la fois ?

La meilleure manière de faire cela est d’utilisa la fonction select(). Cela indique au noyau de vous informer lorsque une action sur socket est possible. Vous pouvez avoir un seul processus faisant des entrées/sorties sur plusieurs socket avec cette fonction. Si vous voulez attendre une connexion sur les sockets 4, 6 et 10, vous devriez avoir le code suivant par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
fd_set socklist;

FD_ZERO(&socklist); /* Always clear the structure first. */
FD_SET(4, &socklist);
FD_SET(6, &socklist);
FD_SET(10, &socklist);
if (select(11, NULL, &socklist, NULL, NULL) < 0)
  perror("select");
Le noyau vous informera aussitôt qu’un événement sera disponible sur un des descripteurs de fichiers inférieurs à 11 (le premier paramètre du select()) membre de la liste de sockets et prêt pour une écriture. Regardez la page d’aide de select() pour plus d’information.
Comment utiliser poll() ?
La fonction poll() attend un pointeur sur un tableau de « struct pollfd ». Le deuxième paramètre indique à la fonction poll() le nombre d’éléments du tableau. Le code doit ressemble a cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int num = 0; 
struct pollfd threesockets[] = { 
         { 4, POLLIN, 0 }, 
         { 6, POLLIN, 0 }, 
         { 10, POLLIN, 0 }, 
}; 

if((num = poll(&threesockets[0], 
          sizeof threesockets / sizeof threesockets[0], 
         -1)) > 0 ) { 
  if(threesockets[0].revents) { 
     /* check with POLLIN whether there 
        is data to read from port 4, 
        POLLERR, POLLHUP and POLLNVAL 
        signal other events */ 
  } 
  if(threesockets[1].revents) {...} 

  if(threesockets[2].revents) {...} 

} else { 
 /* an error occured in poll */ 
}