Salut à tous,

J'ai une classe mere (vSocket) avec un attribut protected:
initialisé avec un constructeur:
Ma classe fille (vServeurTCP) dispose d'un constructeur qui appelle celui de
la classe mere:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
vServeurTCP::vServeurTCP(const int port) : vSocket(port)
{
//ici _sock a changé de valeur 
//autres initialisation
}
Le problème:
_sock vaut 68 dans le constructeur de vSocket appelé par vServeurTCP,
puis il change brusquement de valeur des que je veut recuperer sa valeur dans la suite de mon constructeur de vServeurTCP (il vaut 2009109320).

Je ne comprend vraiment pas comment il peut changer de valeur ainsi. Merci d'avance à ceux qui pourront me répondre !


voilà la totalité du code au cas où:


Le .cpp
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <string>
 
#include "vTCP.h"
 
#define VSOCKET_BUFFER_SIZE 16 //taille des buffer pour l'echange de donnees
/*          __________
__________/  vSocket  \_________________________________________*/
 
/**
CONSTRUCTEUR
@param: adresse ip
@param: port
*/
vSocket::vSocket(std::string ip,int port)
{
        //on initialise winsock
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,0), &WSAData);
 
        if(ip=="INADDR_ANY")
        {
            /*selectionne automatiquement l'ip de la machine sur
            laquelle tourne le programme*/
            _sin.sin_addr.s_addr=htonl(INADDR_ANY);
        }
        else
        {
            //l'ip est spécifiée
            _sin.sin_addr.s_addr=inet_addr(ip.c_str());
        }
        _sin.sin_family		    = AF_INET;
        _sin.sin_port		    = htons(port);
 
        _sock = socket(AF_INET,SOCK_STREAM,0);
 
        std::cout<<"sock initialise a : "<<_sock<<std::endl;//DEBUGAGE
 
        bind(_sock, (SOCKADDR *)&_sin, sizeof(_sin));
 
        std::cout<<"sock apres bind : "<<_sock<<std::endl;//DEBUGAGE
}
 
/**
CONSTRUCTEUR PAR DEFAUT
@param: port
*/
vSocket::vSocket()
{
    _sock=0;
    std::cout<<"Appel du constructeur par defaut du SOCKET"<<std::endl;//DEBUGAGE
 
}
 
/**
CONSTRUCTEUR
@param: port
*/
vSocket::vSocket(int port)
{
    vSocket("INADDR_ANY",port);
}
 
/**
ACCESSEUR
@return: le socket de l'objet
*/
const SOCKET& vSocket::getSocket()
{
    return _sock;
}
 
/**
ACCESSEUR
@return: la structure sockaddr_in de l'objet
*/
const SOCKADDR_IN& vSocket::getSockaddr_in()
{
    return _sin;
}
 
 
/**
METHODE STATIC
@param: le socket sur lequel on souhaite envoyer les donnees
@param: les donnees sous la forme d'une chaine
@return: true si les donnees ont ete correctement envoyees
*/
bool vSocket::envoyerDonnees(SOCKET sock,std::string donnees)
{
    return (send(sock, donnees.c_str(), strlen(donnees.c_str()), 0)!=-1);
}
 
/**
METHODE STATIC
@param: le socket a partir duquel on souhaite recevoir les donnees
@return: une chaine contenant les donnees receptionnees
*/
std::string vSocket::recevoirDonnees(SOCKET sock)
{
        char buffer[VSOCKET_BUFFER_SIZE];   //buffer temporaire
        int size;                           //taille des données reçues à chaque recv
        std::string donneesRecues="";       //concatene les donnees recues
 
        while((size=recv(sock, buffer, VSOCKET_BUFFER_SIZE-1, 0))>0)
        {
            buffer[size] = '\0';            //on replace l'indicateur de fin de chaine au bon endroit
            donneesRecues+=buffer;          //on ajoute le contenu du buffer a la chaine qui sera retournee
        }
        return donneesRecues;
}
 
 
/*          ______________
__________/  vServeurTCP  \_________________________________________*/
 
vServeurTCP::vServeurTCP() : vSocket()
{
std::cout<<"Appel du constructeur par defaut du SERVEUR"<<std::endl;//DEBUGAGE
}
 
 
vServeurTCP::vServeurTCP(const int port) : vSocket(port)
{
    SOCKET                      sockClient=0;
    SOCKADDR_IN                 sinClient;
    int                         sinSizeClient;
 
 
 
    std::cout<<"sock avant listen : "<<getSocket()<<std::endl;//DEBUGAGE
 
    listen(getSocket(),0);
 
    sinSizeClient=sizeof(sinClient);
 
    while(1)
    {
        sockClient=accept(getSocket(),(SOCKADDR*)&sinClient, &sinSizeClient);
        if (sockClient!=INVALID_SOCKET)
        {
            std::cout<<"recoit des donnees"<<std::endl;
            std::string msg;
            msg=vSocket::recevoirDonnees(sockClient);
            std::cout<<msg<<std::endl;
        }
        //std::cout<<sockClient<<std::endl;
    }
}
 
 
/*          _____________
__________/  vClientTCP  \_________________________________________*/
 
vClientTCP::vClientTCP(std::string ip,int port) : vSocket(ip,port)
{
    connect(getSocket(), (SOCKADDR *)&getSockaddr_in(), sizeof(getSockaddr_in()));
    vSocket::envoyerDonnees(getSocket(),"toto va en chine");
}
Le .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
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef VTCP_H
#define VTCP_H
 
#include <winsock2.h>
 
class vSocket
{
    private:
 
        SOCKET          _sock;
        SOCKADDR_IN     _sin;         
 
    public:
 
       vSocket();
       vSocket(std::string ip,int port);
       vSocket(int port);
 
       const SOCKET &           getSocket();
       const SOCKADDR_IN &      getSockaddr_in();
 
       static bool envoyerDonnees(const SOCKET sock,const std::string donnees);
       static std::string recevoirDonnees(const SOCKET sock);
};
 
class vServeurTCP : public vSocket 
{
    public:
         vServeurTCP();
         vServeurTCP(int port);
};
 
class vClientTCP : public vSocket
{
    public:
       vClientTCP(std::string ip,int port);
};
#endif