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++

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    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 éprouvé

    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
    Points : 1 073
    Points
    1 073
    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é.

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    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 éprouvé

    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
    Points : 1 073
    Points
    1 073
    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.

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

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

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    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 éprouvé

    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
    Points : 1 073
    Points
    1 073
    Par défaut
    Peut tu joindre le code complet?

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    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 éprouvé

    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
    Points : 1 073
    Points
    1 073
    Par défaut
    Il manque l'essentiel: serveur.cc

    Les erreurs que tu as viennent de ce fichier, pour t'aider il faut donc avoir son contenu tel qu'il est au moment de ton erreur

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Oups désolé, le voilà.

  11. #11
    Membre éprouvé

    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
    Points : 1 073
    Points
    1 073
    Par défaut
    Tu définis ta structure comme private, ce qui signifie qu'elle n'est utilisable qu'a partir des méthode de la classe.

    Met la en public pour voir?

    Ce n'est pas très beau de proposer ça, mais c'est à des fins de débuggage, on verra ensuite comment rendre cela propre d'un point de vue Orienté Objet.

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    J'ai déjà essayé, ça ne change rien ...

    C'est bizarre le changement d'erreur lorsque je mets l'include ou lorsque je déclare seulement la classe dans server.h
    Si je mets l'include et également la déclaration de la classe, j'obtiens la même erreur que s'il y avait uniquement l'include.

  13. #13
    Membre éprouvé

    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
    Points : 1 073
    Points
    1 073
    Par défaut
    Bon, je profite d'être rentré chez moi pour pouvoir tester en live avec des bouts de code, j'étais à mon travail cette après midi et ne pouvais rien tester.

    Donc dans server.h, il faut effectivement déclarer ta structure publique, mais lui coller un alias avec typedef, comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public:
     
    	typedef struct thread_data{
          fichierEmployes fichier1;
          fichierEmployes fichier2;
          int descripteur;
        } Thread_data;
    Il faut que ce soit publique car tu souhaite l'utiliser de l'extérieur de la classe (principe de l'Orienté Objet, encapsulation).
    Il faut lui coller un Alias, car ensuite tu pourra la désigner par Server::Thread_data, qui signifie "le membre Thread_data de la classe Server". Ensuite, de la ligne 55 à 58 de server.cc, le code devient donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Server::Thread_data *my_data;
         my_data = (Server::Thread_data *) param;
         int descli;
         descli = my_data->descripteur;
    Voila pour cette partie, je n'ai pas put tester le résultat final car je n'ai pas tous tes fichiers, mais en tout cas le problème dont tu parles devrait être réglé.

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Je te remercie pour le temps que tu m'accordes pour me répondre

    J'essaye de mettre ça en place

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    Par défaut
    Effectivement, je n'ai plus d'erreur
    J'avais quelques trucs à modifier mais maintenant c'est bon.

    merci bien

  16. #16
    Membre éprouvé

    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
    Points : 1 073
    Points
    1 073
    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

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 528
    Points : 180
    Points
    180
    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