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

Réseau C Discussion :

Socket multiclients


Sujet :

Réseau C

  1. #1
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut Socket multiclients
    Bonjour,

    Je voudrai savoir qu'elle est la meilleur solution pour programmer un serveur qui accueil plusieur clients.

    Gérer les files descriptor avec select() ou poll() ?

    J'ai pensé sinon à créer un thread par client connecté mais n'est-ce pas trop lourd ?

    Si mon serveur accueil 2000 connectés, qu'elle est la meilleur solution ?
    (Sachant qu'il n'y aura que de l'échange de texte)

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Socket multiclients
    Citation Envoyé par |PaRa-BoL
    Si mon serveur accueil 2000 connectés, qu'elle est la meilleur solution ?
    (Sachant qu'il n'y aura que de l'échange de texte)
    select() ou poll() + pthreads, c'est impec.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Un bon système pour éviter d'allouer 2000 threads dès le départ, ou d'en réallouer en permanence, est le modèle répartiteur / ouvriers (Thread pool).

    Tu peux créer un pool de X threads (mettons 100). A chaque connexion, tu vas associer le client à un thread libre (qui devient alors occupé). Lorsque tous les threads sont occupés, le nouveau client doit patienter. Lorsqu'un client se déconnecte, "son" thread redevient libre, et peut s'occuper des clients en attente (ou attendre en se tournant les pouces si la salle d'attente est vide)

    Ca permet entres autres de ne pas surcharger le serveur en cas de connexions trop nombreuses, et de gérer facilement le nombre de connexions simultanées supportées.

    note: Lorsque tous les threads sont trop souvent occupés, tu peux aussi décider d'en allouer un nouveau paquet: embauche de Y nouveaux ouvriers (pour une durée déterminée ou non).
    And still we will be here, standing like statues ...

  4. #4
    Membre éclairé Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Points : 876
    Points
    876
    Par défaut
    Merci de vos réponses,

    Donc si je comprend bien l'avantage de la solution du "Thread Pool" est que cela évite les charges de création et destruction des threads ?

    Merci

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Oui c'est plus un probléme de ressource si je comprends bien.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  6. #6
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Citation Envoyé par hegros
    Oui c'est plus un probléme de ressource si je comprends bien.
    Voilà exactement.

    Tu demandais si
    Citation Envoyé par
    |PaRa-BoL
    créer un thread par client connecté [...] n'est pas trop lourd ?
    Dans l'absolu, non, mais si 300 clients se connectent d'un coup, tu vas devoir créer 300 threads "en même temps" ce qui n'est pas idéal. Et aussi détuire ceux-ci à la fin des transactions, alors que si ca se trouve 300 autres clients vont se connecter dans les 5 secondes qui suivent

    De plus, même si tu dois pouvoir gérer 2000 clients, as-tu vraiment besoin de les gérer simultanément ? Par exemple, si chaque transaction dure 2 secondes, c'est peut-être (ça dépend du contexte) raisonnable de gérer 400 clients à la fois, et de faire attendre les autres quelques secondes que la place se libère. Ou encore, que doit-t-il se passer si plus de 2000 clients se connectent à ton serveur ?

    C'est des questions qui doivent t'amener à reflechir au meilleur design possible (celui du pool de thread n'est pas idéal pour tous les cas, mais c'est généralement un bon compromis).
    And still we will be here, standing like statues ...

  7. #7
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu n'as pas besoin de threads, tu peux tout gérer en asynchrone avec select() ou /dev/poll ou epoll() ou kqueue, ce qui d'ailleurs sera plus performant au final.
    Boost ftw

  8. #8
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Euh je vais peut-être dire une bétise .... mais comment faire pour traiter les clients de manière asynchrone sans threads ? Select (par exemple) va faire une attente passive, et se reveiller lors de l'activation d'un descripteur.

    La primitive select (4.3 BSD) surveille un ensemble de descripteurs, si aucun n'est actif le processus est endormi et ne consomme aucune ressource cpu. Dès que l'un des descripteurs devient actif (il peut y en avoir plusieurs à la fois) le noyau réveille le processus et l'appel de select rend la main à la procédure appelante avec suffisemment d'information pour que celle-ci puisse identifier quel(s) descripteur(s) justifie(nt) son réveil !
    Il faut ensuite traiter cette activation, et si ce c'est pas à l'aide de threads (ou de fork, mais bon ... ), ce traitement va se faire de manière synchrone. Le prochain appel a select ne se fera qu'une fois le traitement terminé, non ?
    And still we will be here, standing like statues ...

  9. #9
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Ou est ce que je peut trouver plus de détail sur les poll (du genre un exemple) (je vais demander à google)

    Pour les 200 thread, ça m'étonne que se soit possible, j'ai jamais réussi à creer plus de 380 thread sous debian.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  10. #10
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    le meilleur "tutorial" sur ce sujet que j'ai pu trouvé sur le net: http://beej.us/guide/bgnet/

    tu peux gerer avec select dans une appli 'mono-thread', un bon paquet de clients(apres ca depend de tes imperatifs 'temporels')
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  11. #11
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Il faut ensuite traiter cette activation, et si ce c'est pas à l'aide de threads (ou de fork, mais bon ...), ce traitement va se faire de manière synchrone. Le prochain appel a select ne se fera qu'une fois le traitement terminé, non ?
    Oui, mais tu ne fais que traiter le bout de données reçu, et généralement tu n'as pas besoin d'opération bloquante pour cela.
    En fait on utilise un système évenementiel pour savoir quand est-ce qu'il y a des données à lire.

    lighttpd prétend par exemple être 3 fois plus rapide qu'apache grâce à cette approche.
    Boost ftw

  12. #12
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    lighttpd prétend par exemple être 3 fois plus rapide qu'apache grâce à cette approche.
    Ah c'est intéressant. Je vais me documenter la dessus !

    Pour l'instant je ne vois pas trop comment ça peut se passer pour les gros traitements (envoi de fichier par exemple), mais je vais voir tout ça sur la page de lighttpd
    And still we will be here, standing like statues ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Serveur Multiclient sockets
    Par TWEESTY dans le forum Réseau
    Réponses: 7
    Dernier message: 10/06/2010, 11h11
  2. Probleme Socket MultiClient Asynchrone C#
    Par florianl dans le forum C#
    Réponses: 1
    Dernier message: 04/03/2010, 10h40
  3. Sockets, Threads, Multiclients
    Par remilafouine dans le forum VB.NET
    Réponses: 0
    Dernier message: 15/03/2009, 02h35
  4. Socket pour Serveur/Multiclient
    Par NoussaL dans le forum VB.NET
    Réponses: 5
    Dernier message: 28/08/2008, 22h53
  5. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02

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