begin process at 2012 05 30 10:56:45
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

protocole TCP HELP me


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

protocole TCP HELP me

mardi 25 octobre 2005 à 15:02:28 | protocole TCP HELP me

lolobardon

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 <iostream.h>
#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

mardi 25 octobre 2005 à 16:25:29 | Re : protocole TCP HELP me

Arnotic

Administrateur CodeS-SourceS
mais encore ?

@+
Arnotic,
Admin CS,
Développeur chez Néos SDI,
MVP Visual C++
mardi 25 octobre 2005 à 17:43:42 | Re : protocole TCP HELP me

lolobardon

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
mardi 25 octobre 2005 à 17:47:56 | Re : protocole TCP HELP me

Arnotic

Administrateur CodeS-SourceS
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++


Cette discussion est classée dans : erreur, serveur, printf, id, socket


Répondre à ce message

Sujets en rapport avec ce message

socket winsock grrr [ par dekai ] Voilà mon pb lorsque je tente un send ou recv j'obtient une erreur et ej comprends pas pourquoi. Merci de m'aider.Voici le code (je travaille sous dev problème socket sous windows [ par kod32 ] Voici mon code : (winsock2.h)-----------------------------int main(){ /* inialisation */ WSADATA wsa; WSAStartup(MAKEWORD(2,0), &wsa); /* erreur 10038 [ par made_in_france ] Hello ! j'ai un probleme avec la fonction bind de mon programme. En effet cette fonction me renvois l'erreur 10038 « attempted ». Est ce que quelqu'un Toujours besoin d'aide sur socket avec 2 cartes reseau [ par Jeff_Trek ] Bonjour,Je reçois des trames grace à ma socket cliente (qui doit être liée à une carte reseau), et renvoyer ces trames via une socket serveur (qui doi Envois et reception de commande [ par t0Xic_h ] SalutVoici mon code source .La connection entre le client et le serveur se passe bien, mais je n'ai pas su ecrirele code qui me permettera d'envoyer l Socket Protocole HTTP [ par victorcoasne ] Bonjour,J'ai fait un proxy qui intègre un serveur WEB et lorsque que je lui demande de s'interroger, je me rends compte qu'il y a une erreur.Cette err programmation socket serveur client c/c++ [ par beni91 ] Bonsoir, je dois coder un serveur en c sous Windows avec comme compilateur borland mais j'ai des erreur que je n'arrive pas a résoudre. J'ai fait des socket en C sous Qt [ par taifone ] je developpe une application client/serveur en C.Le client est une interface graphique en Qt et le serveur est un programme serveur.c sous linux j'ai Socket et envoi multiple [ par Disdoll ] Bonjour. Je suis en train de coder un socket sous Borland C++ builder 6. Je précise que je suis un novice en socket. Je cherche à pour envoyer deux do problem d'execution de serveur ""CORBA""" [ par aimenvir12 ] Bonjour, j'essayé de develloper une application Client/Serveur mais en exécutant le serveur j'ai eu un erreur il capte l'IOR mais il tourne pas il maf


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,484 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales