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 :

[Réseau] Serveur multiclients (question théorique)


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut [Réseau] Serveur multiclients (question théorique)
    Bonsoir, je poste ce post en étant vachement dégouté, car comme un idiot j'ai commencé le développement d'un serveur en me basant sur (ok la honte) 1 thread par client sans considérer le coût de ceux là.
    Avant de vous demander des conseils je vais décrire la nature de mon serveur:
    - Jeu de poker avec chat (disposition de canaux + messages privés)
    - os: linux & compatible
    - mode connecté biensure (tcp)
    - Protocol utilisé: Un mini irc-like (vraiment très minimal)
    - Nombre de clients que je vise maintenant: 400
    - Densité de l'envoi des données: Je dirai similaire à ce qui se passe sur l'irc, donc ce n'est que des petits textes et de même pour le jeux en question que des petites commandes

    Ma question:
    Que me conseillez vous?
    Après certains débats avec quelques personnes sur l'irc, je suis arrivées à une conclusion dont je ne suis absolument pas sur:
    - Le processus principal: Accept les connexions entrantes + Gestion de l'authentification des utilisateurs
    - thread A: Gestion de tous les clients: Execution des commandes du genre: envoyer un message public ou privée, joindre un canal, changer de pseudo,... etc (des commandes aussi simples quoi)
    - thread B: Gestion des PINGs pour kill'er les clients inactifs
    Est-ce bien défini?
    J'attend vos réflexions avec impatience

    Merci
    Compil your life guy!
    The Aures Project

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    1 thread par client, ce n'est pas si rare que ça. C'est un process par client (les si populaires "serveurs-fork") qui bouffe vraiment les ressources.

    Ce qu'il faut savoir, c'est que le nombre de sockets qu'on peut passer à select() est limité. Donc, il faudrait voir pour commencer si un fd_set accepte 400 sockets. Si ce n'est pas le cas, tu devras utiliser plus d'un thread pour la communication.

    Je ne sais pas trop comment marchent les serveurs basés sur les Thread Pools, mais je pense que le multithread n'est utilisé que pour des opérations longues, et que la communication avec les clients reste centralisée.
    Toutefois, il est peut-être possible que les clients soient répartis (genre, X clients maximum par thread de communication)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Je rajouterais de séparer les différentes fonctions par thread aussi.

    Un pour le chat
    Un pour le jeu

    Je pencherais aussi pour un select pour la gestion des clients, mais comme l'a dis Medinoc, il faut regarder quel est le nombre maximal de descripteurs que select accept (FD_SETSIZE).

  4. #4
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Merci pour vos réponses, cependant:
    Citation Envoyé par Skyrunner
    Je rajouterais de séparer les différentes fonctions par thread aussi.
    Un pour le chat
    Un pour le jeu
    Je n'y vois pas l'interêt en fait, autant laisser les deux fontions dans un seul parcequ'en fait c'est pas un jeu 3D ou un gros trucs comme ça. Ce n'est que de la pur bête 2D (clients en delphi/lazarus) et le jeu se déroule en envoyant simplement une commande du type: GAME MISE JOUEUR 1000... etc

    Sinon juste une question, une chose que je n'ai pas trouvé dans le man. L'argument 1 de la fonction select représente le plus gard fd + 1.
    Que devrai-je mettre dans mon cas? checker la plus grande valeur à chaque création de socket ?

    EDIT:

    Que pensez vous de la libevent? on m'a dit que c'été plus adapté à utilisé que select .... fin moi je connais pas donc je sollicite votre intervention
    Compil your life guy!
    The Aures Project

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Médinoc
    1 thread par client, ce n'est pas si rare que ça. C'est un process par client (les si populaires "serveurs-fork") qui bouffe vraiment les ressources.

    Ce qu'il faut savoir, c'est que le nombre de sockets qu'on peut passer à select() est limité. Donc, il faudrait voir pour commencer si un fd_set accepte 400 sockets. Si ce n'est pas le cas, tu devras utiliser plus d'un thread pour la communication.
    Il est limité par FD_SETSIZE qui chez moi vaut 1024.

    Jc

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Je dirais oui, vérifier la plus grande valeur à chaque création (et peut-être destruction) de socket.
    Sachant que tu peux mémoriser cette valeur pour ne pas avoir à te retaper toute la liste lors de la création...

    Ou bien, tu peux y aller à la barbare et mettre FD_SETSIZE, il me semble.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Ok d'accord Merci
    Et est-ce que quelqu'un s'est déjà servit de la libevent ?
    http://www.monkey.org/~provos/libevent/
    Compil your life guy!
    The Aures Project

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

Discussions similaires

  1. Question théorique réseau LAN à 2 vitesses
    Par odietlin dans le forum Hardware
    Réponses: 3
    Dernier message: 12/01/2015, 21h50
  2. Réponses: 2
    Dernier message: 30/08/2011, 14h16
  3. Question théorique client Web et serveur
    Par Joratois dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 18/08/2008, 19h52
  4. REPLICATION avec sql serveur 2000 - question réseau
    Par lorelei33 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/01/2008, 22h13
  5. Question théorique
    Par bart64 dans le forum Développement
    Réponses: 2
    Dernier message: 14/05/2003, 19h28

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