IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Serveur multi-clients et select()


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Par défaut Serveur multi-clients et select()
    Bonjour à tous,

    Je souhaite mettre en place un serveur multi-clients et ce de manière asynchrone avec un seul thread donc
    J'ai bien évidemment entendu parler de la fonction select() et des fd_set qui vont avec et j'ai justement quelques question à propos de cette dernière!

    * étant donné que la fonction se 'débloque' dès lors que l'un des flux des fd_sets d'entrés change d'état, est-il possible que les fd_sets modifiés par la fonction select() possèdent plus de 1 élément?

    * Si j'ai tout bien compris, A l'interieur d'un while(1):
    1- je construit un fd_set contenant les descripteurs de mes sockets clients
    2- je fais un appel à select avec le fd_set précédemment construit
    3- je récupère les descripteurs des sockets disponibles en lecture puis je gère le reste

    Cela implique donc de reconstruire un fd_set (un tableau de long donc) à chaque fois qu'un client envoit des donnés vers le serveur ou se déconnecte.
    Cela ne me parait pas très performant et donc je souhaiterais savoir s'il existe un moyen de réutiliser toujours le même fd_set qui reste à priori constant un bon bout de temps ou quelque chose dans ce genre la, ce qui éviterai de le reconstruire à chaque fois ou de le copier depuis un fd_set original?

    Je remercie par avance ceux qui jetteront un ptit coup d'oeil à ce topic

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    étant donné que la fonction se 'débloque' dès lors que l'un des flux des fd_sets d'entrés change d'état, est-il possible que les fd_sets modifiés par la fonction select() possèdent plus de 1 élément?
    Oui.

    Cela implique donc de reconstruire un fd_set (un tableau de long donc) à chaque fois qu'un client envoit des donnés vers le serveur ou se déconnecte.
    Cela ne me parait pas très performant et donc je souhaiterais savoir s'il existe un moyen de réutiliser toujours le même fd_set qui reste à priori constant un bon bout de temps ou quelque chose dans ce genre la, ce qui éviterai de le reconstruire à chaque fois ou de le copier depuis un fd_set original?
    L'autre moyen consiste à ne pas utiliser select mais à utiliser des fonctions plus puissantes qui dépendent de l'OS.

    L'idéal étant d'utiliser une bibliothèque qui va déjà utiliser le meilleur truc pour toi. Genre boost.asio.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Par défaut
    Finalement je n'avais pas assez bien cherché!
    On peut faire appel à epoll() en lieu et place de select(). Ce dernier possède apparemment un algorithme plus performant (du type O(1) contrairement à select() qui est du type O(n)) mais cette page vous en dira davantage.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Et c'est Linux 2.6 uniquement.

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/04/2010, 23h34
  2. serveur multi clients
    Par aaronw dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/03/2006, 09h01
  3. Fork, pthread et serveur multi-clients
    Par Pico10 dans le forum POSIX
    Réponses: 13
    Dernier message: 05/01/2006, 11h48
  4. Serveur Multi-clients
    Par darsky dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/04/2004, 09h53
  5. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo