• # Select

    Posté par . En réponse au message Serveur de tchat. Évalué à 2.

    Algo vite fait :
    /* set de sockets écouteurs */
    fd_set fdSetEcouteurs;
    /* Controle de la boucle */
    int bTourner = 1;
    /* Tableau de sockets qui écoutent */
    int *skTabEcouteurs = NULL;
    /* Effectif du tableau */
    int iNbEcouteurs = 0;
    /* Retour de select() */
    int iRet = 0;
    while( bTourner )
    {
     /* Nettoie le set de descripteurs/sockets */
     FDZERO(&fdLecture); FDZERO(&fdEcriture); FDZERO(&fdException);
     /* On le remplit avec nos écouteurs */
     for (i=0; i < iNbEcouteurs; i++) { FDSET(skTabEcouteurs[i], fdSetEcouteurs); }
     /* Select */
     iRet = select(i, &fdSetEcouteurs, NULL, NULL, NULL);
     /* ^ ^ ^ ^ ^ */
     /* nb sockets lecteurs 'écriveurs' exceptions timeout */
     /* Dans la pratique, mieux vaux un timeout ;) */
     /* (Le nombre de sockets n'est pas nécessaire sous Win32) */
     
     /* On teste si tout s'est bien passé */
     if (iRet != 0) { perror("COIN!"); exit(1); }
     
     /* Select a enlevé du set tous les écouteurs qui n'ont rien à dire */
     /* On teste donc ce qui reste dans le set de départ */
     for (i=0; i < iNbEcouteurs; i++)
     {
     if( FDISSET(skTabEcouteurs[i], fdSetEcouteurs) )
     {
     /* Il y a de la lecture sur ce socket */
     printf("Le socket %i a quelque chose à dire !\n", i);
     }
     }
     /* Et c'est reparti pour un tour... */
    }