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

Langage C++ Discussion :

Membre d'une classe change sans raison


Sujet :

Langage C++

  1. #1
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut Membre d'une classe change sans raison
    Bonjour,

    Lorsque je connecte 3 clients, ou plus, ma classe qui correspond a un client change un de ses membre sans aucune raison
    Pour faire court,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Session {
            public:
                    inline const int GetSocket() const { return sock; }
            private:
                    int sock;
    }
    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
    23
    24
    25
     
    //[... plus de code]
            ConnectedClients = Collection->AllSessions(); // copie par reference des clients
    // de type: std::map<int, Session*>
     
            if(Collection->Count() == 3)
            {
                std::cout << "I have now 3 clients connected, let's echo their socket number !"<<std::endl;
                ConnectedClients = Collection->AllSessions();
     
                for(auto itr = ConnectedClients.begin(); itr != ConnectedClients.end(); ++itr)
                {
                    Target = itr->second; // de type Session*
                    sock = itr->first;
                    std::cout << "Key: " << sock << " & Session*->sock = " << Target->GetSocket() << std::endl;
                }
            }
     
            for(auto itr = ConnectedClients.begin(); itr != ConnectedClients.end(); ++itr)
            {
                Target = itr->second;
                sock = itr->first;
                std::cout << "Loop over : " << Target->GetSocket() << std::endl;
     
    //[... plus de code]
    Donc voila, entre la deuxieme boucle et la troisieme, la valeur de Target->GetSocket() change, voici un screenshot pour mieux comprendre...



    edit:
    J'ai ajouté en plus dans le code un std::cout sur l'adresse de Target pour voir si elle ne changait pas en cours de route, non elle est toujours bonne. Donc c'est bien le int sock; qui change d'un coup... !

    Evidemment, le reste du programme plante salement à cause de ca..

    Si vous avez des idées, je suis preneur!
    merci, nico

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    qui a t'il à la fin de la deuxième boucle ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    La valeur qui est affichée me fait beaucoup penser à une variable non initialisée.
    Serait-il possible que le 3° client soit supprimé de la liste avant d'en recréer un ?
    Peut-être un constructeur par copie incorrect ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Regarde la premiere boucle, elle lit les valeurs des clients également !
    Et elle marche tres bien, en revanche la 2e boucle, paf...
    Je comprend pas du tout comment c'est possible !

    Les valeurs dans le constructeur sont bonnes, et meme juste apres, elles sont encore bonnes, quand le 3e client arrivé, voila ce qu'il se passe:

    main thread
    - lock mutex
    - creer un objet session, le memoriser
    - ajouter le socket au desripteur de fichier
    - lacher le mutex
    thread de reception
    - on verifie si il y a des clients, et aussi si select > 0
    - la boucle donnée dans le premier post

    voici un screenshot avec les adresses:

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Si tu es sous Visual, passe en debug et utilise un DataBreakpoint
    Si tu es sous autre chose, il y a peut-être aussi un outil correspondant.
    Recherche dans tout le code où est modifié cette variable et debug à l'ancienne.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    je vien s de lancer un debug, et la y avait aucun changement etrange de variable <_<


    Et sans le debogage, ben vous avez l'image, ca foire...

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Ce qui me conforte dans l'idée de la variable non initialisée après copie/destruction.
    Donc là typiquement "t'es dans la mouise".
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Quand un nouveau client se connecte, je construit un objet session, et le stocke dans une std::map:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            void CreateSession(const std::string& ip, const int sock, Selector* slt)
            {
                _sessions.insert(make_pair(sock, new Session(ip, sock, slt)));
                std::cout << "<info> I have now " << Count() << " clients connected (Last socket = " << sock << ")" << std::endl;
            }
    Et voici le constructeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            Session(const std::string& ip_, const int sock_, Selector* slt) :
                auth(0)
                sock(sock_),
                ip(ip_),
                servername("unknown"),
                reader(new PacketReader()),
                selector(slt)
                {
                    handler = new UnknownPacketHandler(this, selector);
                    std::cout << "Create session, socket is now: " << sock << std::endl;
                }
    Juste apres la construction de l'objet, je fais un cout sur ip, sock, et ils fonctionnent bien.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    As-tu un constructeur par copie ou utilises-tu celui par défaut ?
    C'est plutôt ce dernier que je suspecte.

    Typiquement, dans ton constructeur par défaut le handler ne serait pas correct.
    Le reader court aussi un risque d'être incorrect, il copierait le pointeur de celui de la classe copiée, avant de le détruire (je suppose que tu fais ça bien et le détruis dans son destructeur) quand l'objet est détruit.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Le constructeur posté est le seul que j'ai, et j'ai essayé de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Session() { std::cout << "constructeur defaut"<<std::endl}
    il n'est jamais appelé.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Toujours pas, je parle d'un constructeur par copie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Session(const Session& src) { std::cout<<"construit par copie"<<std::endl;
    Si un constructeur par défaut devait être appelé sans en avoir un, tu aurais une erreur à la compilation.
    Il crée un constructeur par défaut si aucun constructeur n'existe, ce qui n'est pas ton cas.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Le constructeur par copie n'est jamais appelé non plus !

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Alors là, joker.
    Peux-tu vérifier chaque ligne qui modifie sock ? (je suppose la valeur retournée par getSocket() ) si tant est qu'il y en ait une

    AllSessions retourne bien un const std::map<int, Session*>& ?
    Est-ce que si tu supprimes ta première boucle le bug est toujours là ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Sans la boucle qui fait juste un cout, donc seulement avec la vraie boucle



    Toujours le meme probleme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            inline std::map<int, Session*>& AllSessions() { return _sessions; }
    Pas de const, sinon je peux pas faire de find/erase dessus

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    C'est vraiment mystique, mais quand on saura d'où ça sort ça nous paraîtra surement très con^^
    Et si tu sors la première boucle pour l'afficher à la place de la 2° ? Remplacer la 2° par la première, sans afficher la 1°.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  16. #16
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Sans la vraie boucle sur les clients:



    Tout va bien, et j'ai mes clients qui se connectent tranquillement,

    maintenant, avec le code original:




    bug

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Je vois une erreur 10038 que tu n'as jamais mentionné auparavant dans la console.

    http://stackoverflow.com/questions/3...8-socket-error

    Il semble qu'il faille maintenant regarder quand et où tes destructeurs sont appelés.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  18. #18
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    C'est normal que l'erreur survienne, etant donné que le "int sock" = 684685498646848648, eh bien l'erreur 10038 survient.

    Donc le probleme n'est aps cette erreur, mais toujours bien la valeur du int qui change !

  19. #19
    Membre très actif
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Par défaut
    Juste apres l'accept() j'ai imprimé les clients connecté de la meme facon que je vous ai montré plus haut, aucun problème, et cest le seul moment ou il y a des modifications (creation dun objet session)

    je vois pas du tout d'où cela peux venir...

Discussions similaires

  1. Taille texte d'une listbox change sans raison
    Par stressman dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/04/2008, 00h21
  2. Objet vector<Type> membre d'une classe
    Par Chewbi dans le forum SL & STL
    Réponses: 3
    Dernier message: 16/02/2006, 17h12
  3. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35
  4. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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