• [^] # Re: Broadcast en C

    Posté par . En réponse au journal Broadcast en C. Évalué à 1.

    De toutes facons, tu auras toujours 1000 sockets à gérer.

    Donc il faudra soit créer 1000 threads, chacun gérant une socket, soit faire un select.

    Grosso modo, select, c'est, tu mets tous tes descripteurs de socket ( l'entier renvoyé par accept) dans un fd_set tu fais un select en spécifiant un timeout, et il te renvoie le fd_set avec dedans toutes les sockets sur lesquelles quelque chose est arrivé (c'est très simplifié comme explication)

    Donc, grosso modo, en mettant que tu aies un tableau sockets contenant les descripteurs, et fd l'identifiant de ton fd_set:

    fd_set fd;
    struct timeval timeout;

    /* On vide le fd_set
    FD_ZERO( &fd );

    /* On remplit le fd_set */
    for( i = 0 ; i< taille_de_sockets ; i++)
    {
    FD_SET( sockets[i]; &fd );
    }

    /* Attendre 1seconde et demi */
    timeout.tv_sec = 1;
    timeout.tv_sec = 500000;

    i_ret = select( taille_de_sockets, &fd, NULL, NULL, &timeout);

    /* On regarde quelles sockets ont répondu et on traite */
    if( i_ret == -1 && errno != EINTR)
    {
    /* Erreur */
    }
    else if (i_ret > 0)
    {
    /* Au moins une socket a renvoyé qqch (le nombre de sockets ayant renvoyé est i_ret) */

    for (i = 0 ; i< taille_de_sockets ; i++)
    {
    if( FD_ISSET( sockets[i], &fd ) )
    {
    /* Des données sont arrivées sur cette socket */
    process( sockets[i] );
    /* On peut faire un recv sur cette socket pour récupérer les données*/
    }
    }
    }
    else if( i_ret == 0)
    {
    /* Aucune socket n'a recu de données avant l'expiration du timeout */
    }