Protocole TCP HELP me

lolobardon Messages postés 6 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 8 décembre 2005 - 25 oct. 2005 à 15:02
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012 - 25 oct. 2005 à 17:47
Bonjour à tous,
je suis actuellement à Pékin pour effectuer un semestre d'études. Je suis élève ingénieur en électronique mais l'embêtant c'est qu'ici je dois programmer en C++. N'ayant que de vagues notions, je suis confronté à pas mal de problèmes.

La première partie de mon projet consiste à construire un programme basé sur le protocole TCP. J'ai donc été sur cppfrance où j'ai trouvé des programmes intéressants. J'ai voulu ajouter des éléments aux programmes de base et j'obtiens quelques erreurs que je ne comprends vraiment pas. Je joins ci dessous mes fichiers. Merci d'avance et bonne lecture.

///////////////////////////////////////////////////////////////////////////////
#include <winsock2.h>
#include
#include <string.h>
#include <cstdio>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")



//Creation de la classe Reseau


class CReseau


{
//Fonctions
public :


//constructeur par defaut
CReseau();



//destructeur par defaut
virtual ~CReseau();


// Fonction dinitialisation de la connexion
// Si serveur_client vaut true, mode serveur actif sinon mode client
bool choixModeConnexionTCP(bool serveur_client, char *pIP, unsigned int PORT);


// Fonctions envoyant et recevant des donnees sur le reseau
bool sendBuf(char *pSendBuff);
bool receivBuf(char *pReceivBuff, sizeof(pReceivBuff));


//protection des variables et fonctions dinitialisation
protected :


// fonctions d'initialisation TCP
SOCKET initTCPServeur(unsigned int PORT);
SOCKET initTCPClient(char *pIP, unsigned int PORT);


// variable recevant le handle de la connexion en cours
SOCKET id_de_la_socket; // Identifiant de la socket


// structure SOCKADDR_IN contient les infos techniques du socket
SOCKADDR_IN sin;


// variable indiquant si la connexion a ete initialisee ou non
bool initSocket;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Implantation de la classe Reseau
#include "Reseau.h"


//////////////////////////////////////////////
// //
// Constructeur //
// //
//////////////////////////////////////////////


// ***********************
// CONSTRUCTEUR PAR DEFAUT
// ***********************


CReseau :: CReseau ()


{

}


//////////////////////////////////////////////////////////////
// //
// Fonctions membres protected //
// //
//////////////////////////////////////////////////////////////


// ********************************************************
// FONCTION D'INITIALISTATION DU PROTOCOLE TCP COTE SERVEUR
// ********************************************************


SOCKET CReseau::initTCPServeur(unsigned int PORT)
{


// ***************************
// Initialisation de la socket
// ***************************


// Declaration des variables
WSAData initialisation_win32; // Variable permettant de récupérer la structure d'information sur l'initialisation
int erreur;// Variable permettant de récupérer la valeur de retour des fonctions utilisées
int tempo;


// Initialisation de Winsock
erreur = WSAStartup(MAKEWORD(2,2),&initialisation_win32);
if (erreur != 0)
printf("\nDesole, je ne peux pas initialiser Winsock du a l'erreur : %d %d", erreur, WSAGetLastError());
else
printf("\nWSAStartup : OK");



// Ouverture d'une Socket
id_de_la_socket = socket(AF_INET,SOCK_STREAM,0);//Definition du socket
if (id_de_la_socket == INVALID_SOCKET)
printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d",WSAGetLastError());
else
printf("\nsocket : OK");


// ********************
// Ecoute du port TCP
// ********************


// Declaration des variables
SOCKADDR_IN information_sur_la_source; // Creation d'une structure SOCKADDR_IN indispensable pour utiliser winsock


// Lie la socket a une @IP et a un port d'ecoute
information_sur_la_source.sin_family = AF_INET;
information_sur_la_source.sin_addr.s_addr = INADDR_ANY; // Ecoute sur toutes les IP locales
information_sur_la_source.sin_port = htons(PORT); // Ecoute sur tous les ports
erreur = bind(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,sizeof(information_sur_la_source));
if (erreur != 0)
printf("\nDesole, je ne peux pas ecouter ce port : %d %d",erreur,WSAGetLastError());
else
printf("\nbind : OK");


// *******************************
// Etablissement d'une session TCP
// *******************************


// Attente d'ouverture de session, mise en ecoute du serveur


erreur = 99; // Initiation de erreur pour être sur que l'on va rentrer dans la boucle
while(erreur != 0) // Boucle tant qu'une demande de session (SYN) TCP n'a pas été reçu
erreur = listen(id_de_la_socket,1);
printf("\nlisten : OK");


// Déclaration des variables


SOCKET id_de_la_nouvelle_socket; // Identifiant de la nouvelle socket

// Acceptation de la demande d'ouverture de session


printf("\nAttente de la reception de demande d'ouverture de session TCP (SYN)");
tempo = sizeof(information_sur_la_source); // Passe par une variable afin d'utiliser un pointeur
id_de_la_nouvelle_socket = accept(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,&tempo);
if(id_de_la_nouvelle_socket == INVALID_SOCKET)
printf("\nDesole, je ne peux pas accepter la session TCP du a l'erreur : %d",WSAGetLastError());
else
printf("\naccept : OK");
}

// ******************************************************
// FONCTION D'INITIALISATION DU PROTOCOLE TCP COTE CLIENT
// ******************************************************


SOCKET CReseau :: initTCPClient(char *pIP, unsigned int PORT)
{


// ***************************
// Initialisation de la socket
// ***************************


// Declaration des variables
WSAData initialisation_win32; // Variable permettant de récupérer la structure d'information sur l'initialisation
int erreur;// Variable permettant de récupérer la valeur de retour des fonctions utilisées



// Initialisation de Winsock
erreur = WSAStartup(MAKEWORD(2,0),&initialisation_win32);
if (erreur != 0)
printf("\nDesole, je ne peux pas initialiser Winsock du a l'erreur : %d %d",erreur,WSAGetLastError());
else
printf("\nWSAStartup : OK");

// Declaration des variables
SOCKET id_de_la_socket; // Identifiant de la socket


// Ouverture d'une Socket
id_de_la_socket = socket(AF_INET,SOCK_STREAM,0);//Definition du socket
if (id_de_la_socket == INVALID_SOCKET)
printf("\nDesole, je ne peux pas creer la socket du a l'erreur : %d",WSAGetLastError());
else
printf("\nsocket : OK");


// *******************************
// Etablissement d'une session TCP
// *******************************
/* La difference avec le serveur et que le client n'attend pas de connexion. Il essaye directement de se connecter et s'il echoue, il renvoie INVALID_SOCKET,
au lieu de la connexion en cours, a travers s1. */


// Declaration des variables
SOCKADDR_IN information_sur_la_destination; // Déclaration de la structure des informations lié au serveur


// Lie la socket a une @IP et a un port d'ecoute
information_sur_la_destination.sin_family = AF_INET;

// inet_addr() convertie la chaine de caractere en adresse IP valide
information_sur_la_destination.sin_addr.s_addr = inet_addr(pIP);
information_sur_la_destination.sin_port = htons(PORT); // Ecoute sur tous les ports
erreur = connect(id_de_la_socket,(struct sockaddr*)&information_sur_la_destination,sizeof(information_sur_la_destination));
if (erreur != 0)
printf("\nDesole, je n'ai pas pu ouvrir la session TCP : %d %d",erreur,WSAGetLastError());
else
{
return id_de_la_socket;
printf("\nsession ouverte : OK");
}
}


//////////////////////////////////////////////////////////////
// //
// Fonctions membres publiques //
// //
//////////////////////////////////////////////////////////////


// ********************************************
// CHOIX DU MODE DE CONNEXION CLIENT OU SERVEUR
// ********************************************


// Si serveur_client vaut true, mode serveur actif sinon mode client
bool CReseau :: choixModeConnexionTCP(bool serveur_client, char *pIP, unsigned int PORT)
{
if ( !initSocket ) // si la connexion n'a pas ete deja initialisee
{
if ( serveur_client ) // si l'utilisateur a choisi d'utiliser la fonction serveur
{
printf("\n Vous avez choisi la fonction serveur");
cout << "Entrer le numero de PORT utilise" << endl;
cin >> PORT;
id_de_la_socket = initTCPServeur(PORT); // recuperation du handle de la connexion
if ( id_de_la_socket != INVALID_SOCKET ) // si la connexion est valide
{
initSocket = true;
return true;
}
else if ( !serveur_client ) // si l'utilisateur a choisie d'utiliser la fonction client
{
printf("Vous avez choisi la fonction client");
cout << "Entrer l'adresse IP du serveur" << endl;
cin >> pIP;
cout << "Entrez le numero de PORT utilise" << endl;
cin >> PORT;
id_de_la_socket = initTCPClient(pIP, PORT); // recuperation du handle de la connexion
if ( id_de_la_socket != INVALID_SOCKET ) // si la connexion est valide
{
initSocket = true;
return true;
}
}
}
}
return false;
}


// ******************
// ECHANGE DE DONNEES
// ******************


// ******************************
// Envoi de donnees par le client
// ******************************


bool CReseau :: sendBuf(char *pSendBuff)
{
if ( initSocket ) // on verifie si la connexion a ete initialisee
{
int erreur;
erreur = send (id_de_la_socket, pSendBuff, strlen(pSendBuff), 0); if ( (erreur !SOCKET_ERROR) && (erreur 0) )
{
return true; // en cas de reussite, on renvoie true
printf("\nsend : OK");
}
else
{
return false; // si la connenxion n'a pas ete initlialise ou qu'il y a eu une erreur
printf("\nEnvoi impossible : %d %d",erreur,WSAGetLastError());
}
}
}


// ***********************************
// Reception de donnees par le serveur
// ***********************************


bool CReseau :: receivBuf(char *pReceivBuff, sizeof(pReceivBuff))
{
if ( initSocket )
{
int erreur;
erreur = recv (id_de_la_socket, pReceivBuff, sizeof(pReceivBuff), 0); if ( (erreur !SOCKET_ERROR) && (erreur 0) )
{
return true; // en cas de reussite, on renvoie true
printf("\nreceiv : OK");
printf("Voici les donnees : %sock",pReceivBuff);
pReceivBuff[erreur] = '\0';// // Permet de fermer le tableau après le contenu des data, car la fonction recv ne le fait pas
}
else
{
return false; // si la connexion n'a pas ete initlialise ou qu'il y a eu une erreur
printf("\nFile not received : %d %d",erreur,WSAGetLastError());
}
}
}



//////////////////////////////////////////////
// //
// Destructeur //
// //
//////////////////////////////////////////////


// ***********
// DESTRUCTEUR
// ***********

CReseau::~CReseau()
{
SOCKET id_de_la_socket;
int erreur;


//si la connexion a ete initialisee
if ( initSocket )
{


// ***************************
// fermeture de la session TCP
// ***************************


erreur = shutdown(id_de_la_socket,2); // 2 signifie socket d'émission et d'écoute
if (erreur != 0)
printf("\nDesole, je ne peux pas fermer la session TCP du a l'erreur : %d %d",erreur,WSAGetLastError());
else
printf("\nshutdown : OK");
// *************************
//libere l'acces a la socket
// *************************


erreur = closesocket(id_de_la_socket);


if (erreur!=0)
printf("\nDesole, je ne peux pas liberer la socket du a l'erreur : %d %d",erreur,WSAGetLastError());
else
printf("\nclosesocket : OK");
// ***********************
// libere l'acces a winsock
// ***********************


erreur = WSACleanup(); // A appeler autant de fois qu'il a été ouvert.
if (erreur!=0)
printf("\nDesole, je ne peux pas liberer winsock du a l'erreur : %d %d",erreur,WSAGetLastError());
else
printf("\nWSACleanup : OK");


initSocket = false;
}
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "Reseau.h"


// *******************
// PROGRAMME PRINCIPAL
// *******************


void main()
{
int number_saisi = 0;
CReseau reseau;



cout << "Welcome da jia!";
cout << "Tape 1 pour choisir le mode client\nTape 2 pour choisir le mode serveur" << endl;
cin >> number_saisi;


if ((number_saisi) != (1 || 2))
{
cout << "Erreur de saisie, veuillez appuyer sur 1 ou 2" << endl;
}


else if (number_saisi = 1)
{
bool serveur_client = TRUE;
reseau.choixModeConnexionTCP(serveur_client,pIP,PORT);
reseau.receivBuf(pReceivBuff,sizeof(pReceivBuff));
}


else if (number_saisi = 2)
{
bool serveur_client = FALSE;
reseau.choixModeConnexionTCP(serveur_client,pIP,PORT);
reseau.sendBuf(pSendBuff);
}


cout << "La connexion va maintenant etre interrompue" << endl;

//appel du destructeur
// reseau.~CReseau();

}


//////////////////////////////////////////////////////////////////////////////////////////
Merci d'avance à tous ceux qui me répondront.

LYB

3 réponses

cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
25 oct. 2005 à 16:25
mais encore ?

@+
Arnotic,
Admin CS,
Développeur chez Néos SDI,
MVP Visual C++
0
lolobardon Messages postés 6 Date d'inscription jeudi 29 septembre 2005 Statut Membre Dernière intervention 8 décembre 2005
25 oct. 2005 à 17:43
Mes deux problèmes sont le programme principal et le constructeur de Reseau.cpp qui génère une erreur aussi et je ne comprends vraiment pas pourquoi.

Au niveau du programme principal, l'ordi affiche que des variables ne sont pas déclarées alors qu'elles le sont dans les fonctions dans Reseau.cpp. Mes appels de fonctions sont-ils mauvais?

Merci à tous ceux qui répondront

LYB
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
25 oct. 2005 à 17:47
si variable dans plusieurs fichiers, utilisation de extern type var dans les autres.

@+
Arnotic,
Admin CS,
Développeur chez Néos SDI,
MVP Visual C++
0
Rejoignez-nous