Heritage, constructeur,attribut protected qui change
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:
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:
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:
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 |