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

Threads & Processus C++ Discussion :

Client/Serveur multi thread


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut Client/Serveur multi thread
    Bonjour tout le monde,

    je suis en train de réaliser un client/server en c++ (J'suis sous linux) et j'ai un petit problème.
    Ce que je souhaite faire, c'est que chaque client qui se connecte au serveur doit entrer un login/password et s'il est identifié par le serveur (Stockage des clients dans un fichier txt), le serveur envoie un message au client et un thread est créé.

    Cela marche comme je le souhaite avec un client et je souhaite donc maintenant faire du multi-threading. Actuellement je peux connecter autant de client que je veux, chacun devra entrer son login/password mais j'ai un problème:
    Admettons que je connecte un client puis un deuxième. Les deux doivent saisir leur login/password mais le contrôle du client2 ne se fera uniquement lorsque le client1 aura fini de saisir ses informations. En résumé, je peux connecter plusieurs clients mais la vérification se fera dans l'ordre des clients, les uns après les autres.

    Voilà le bout de code de mon serveur.

    En fait le deuxième client restera bloqué au 2ème while tant que le premier sera pas passé.

    Je vous remercie par avance.

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    C'est normal, tu fait tes recv et ton appel à fichier.utilisateurExistant(duo) dans ta boucle principale, donc avant d'être dans un nouveau thread dédié à ton client.

    Il faudrait que l'intégralité du traitement de la connexion client soit fait dans un thread, si tu ne veut pas être bloqué par l'attente de retour.

    Et tu devra te méfier ensuite de l'appel à pthread_join, qui bloque tant que le thread donné en paramètre n'est pas terminé.
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  3. #3
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    Donc si j'ai bien compris, après la boucle while avec le accept, je créer un thread. Dans cette boucle il y aura uniquement la création du thread. Et c'est une fois ce thread créé que je contrôle l'existance du client. C'est bien ça ?

    Comment je fais pour passer plusieurs paramètres au thread ? Car là j'ai simplifié mais je dois vérifier plusieurs fichiers avec mon client. J'ai donc plusieurs paramètres a passer ...

    ps : Je suis débutant, je ne sais pas trop à quoi me sert le join, je l'ai juste vu dans quelques tuto

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    Tu as comprit le principe.

    http://www.linux-kheops.com/doc/man/..._create.3.html

    https://computing.llnl.gov/tutorials...ssingArguments

    Voila pour le passage des arguments.

    Le join est une simple attente sur la terminaison d'un thread, pour ensuite récupérer son résultat.
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  5. #5
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    Merci, j'essaye ça de suite et je reviens dire si tout est bon

  6. #6
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    J'ai tombe sur un petit problème en faisant comme tu m'as dit mais je pense qu'on sort du sujet présenté auparavant. Je dois peut être créer un autre sujet ... je sais pas.

    Je post quand même le problème :
    Lorsque je compile, j'ai cette erreur
    server.cc:58: error: invalid use of incomplete type ‘struct thread_data’
    server.cc:55: error: forward declaration of ‘struct thread_data’


    voilà comment je déclare ma structure dans server.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct thread_data{
       fichierEmployes fichier1;
       fichierEmployes fichier2;
       int descripteur;
    };
    J'ai un include fichierEmployes dans le server.h.
    J'ai chercher un peu sur les forums et il se dit qu'il faut mettre
    class fichierEmployes; au début du fichier. Je le fais et je supprime l'include. J'obtiens cette erreur : server.h:11: error: field ‘fichier1’ has incomplete type

    Je tourne en rond du coup

  7. #7
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    Peut tu joindre le code complet?
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  8. #8
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    Oui bien sûr.

    fichierEmployes.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #ifndef FICHIEREMPLOYES_H
    #define FICHIEREMPLOYES_H
     
    #include <string>
     
    using namespace std ;
     
    class fichierEmployes{
     
      private:
        string nom;
      public:
        fichierEmployes();
        fichierEmployes(string nom);
        ~fichierEmployes();
     
        bool lectureFichier();
        bool utilisateurExistant(string nomMdp);
        void ajouterUtilisateur(string nom, string mdp);
    };
     
    #endif
    server.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #ifndef SERVER_H
    #define SERVER_H
    //#include "fichierEmployes.h"
     
    class fichierEmployes;
     
    class Server{
      private:
        struct thread_data{
          fichierEmployes fichier1;
          fichierEmployes fichier2;
          int descripteur;
        };
     
      public:
        void server1(fichierEmployes fichier_log, fichierEmployes fichier_liste);
    };
    #endif

  9. #9
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    Et pour le multi-thread c'est ok aussi?

    Passe ton sujet en résolu si tu n'as plus rien à demander
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  10. #10
    Membre éclairé Avatar de 4rocky4
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Par défaut
    Oui oui ça c'était bon, c'était juste la structure que je déclarais mal effectivement

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

Discussions similaires

  1. demande d'aide client serveur multi thread
    Par nico1488 dans le forum Réseau
    Réponses: 0
    Dernier message: 19/03/2010, 09h27
  2. Client pour serveur multi thread
    Par Seb33300 dans le forum Général Java
    Réponses: 9
    Dernier message: 26/05/2007, 10h39
  3. [Socket] un serveur multi thread
    Par mzt.insat dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 12/11/2005, 13h25
  4. Réponses: 7
    Dernier message: 19/10/2004, 19h09
  5. Réponses: 16
    Dernier message: 30/01/2004, 11h05

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