begin process at 2012 02 11 12:21:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Toujours besoin d'aide sur socket avec 2 cartes reseau


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

Toujours besoin d'aide sur socket avec 2 cartes reseau

jeudi 10 novembre 2005 à 14:07:37 | Toujours besoin d'aide sur socket avec 2 cartes reseau

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 doit être liée à une autre carte reseau).

Voici mon code Source Client  qui possede l'adresse IP d'un serveur :

/**********************************
THREAD POUR LA LECTURE DES TRAMES
***********************************/
//DWORD _stdcall Fthread(void*rien)
void FthreadClientAnglais(void *)
{
 int continuer = TRUE;
 int len;
 char message[255];
 int Nb_Caracteres_Recus;
 char Message_Recu[255];
 char szErr[255]; 
 int intCheksum;
 char strCheksum[1];


 //SOCKET Desc_Socket_Cliente;
 int Desc_Socket_Cliente;
 SOCKADDR_IN Adresse_Socket_Serveur;
 //WORD wVersionRequested;
 WSADATA wsaData;

 struct hostent *hostentptr;

 //wVersionRequested=MAKEWORD(1,1);


 strcpy(szErr,"Lancement de WSAStartup !\r\n");
 printf("%s",szErr);

 //WSAStartup(wVersionRequested,&wsaData);

 //Init Winsock
 if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0)
 {
  printf("Impossible d'initialiser Winsok.\n\n");
 }
 else
 {
  printf("Winsock initialisé avec succès.\n\n");
 } 
 
 strcpy(szErr,"Definition de la socket !\r\n");
 printf("%s",szErr);
  

 //getch();

 Desc_Socket_Cliente=socket(AF_INET,SOCK_STREAM,0);
 if (Desc_Socket_Cliente==INVALID_SOCKET)
  printf("Erreur lors de la création de la socket : erreur %d.\n\n",WSAGetLastError());
 else printf("Socket créée avec succès.\n\n");
 
 strcpy(szErr,"Definition de la socket Terminée !\r\n");
 printf("%s",szErr); 
 
 printf("IP du serveur Anglais Parametre : %s\n",ADRESSE_IP_SERVEUR_PARAMETRE);
 printf("Port TCP Serveur Anglais : %d\n",Serveur_Anglais->intPortTCP);
 
 hostentptr=gethostbyaddr
   (
   (const char *)ADRESSE_IP_SERVEUR_PARAMETRE,
   4,
   AF_INET
   ); 
  
  ZeroMemory(&Adresse_Socket_Serveur,sizeof(Adresse_Socket_Serveur));

  Adresse_Socket_Serveur.sin_family=(*hostentptr).h_addrtype;
  //Adresse_Socket_Serveur.sin_port=htons(PORT);
  
  Adresse_Socket_Serveur.sin_port=htons(Serveur_Anglais->intPortTCP);    

  Adresse_Socket_Serveur.sin_addr=*((struct in_addr*)(*hostentptr).h_addr);

 connect
  (
  Desc_Socket_Cliente,
  (const struct sockaddr*)&Adresse_Socket_Serveur,
  sizeof(Adresse_Socket_Serveur)
  );

  strcpy(szErr,"Attente Connexion du Serveur Anglais !\r\n");
  printf("%s",szErr);

  while(continuer)
  {
  
   Nb_Caracteres_Recus=recv
   (
    Desc_Socket_Cliente,
    Message_Recu,
    sizeof(Message_Recu),
    0
   );
   
   printf("Nombre caractères reçus :%d\n",Nb_Caracteres_Recus);

   if(Nb_Caracteres_Recus<=0)
   {    
    continuer=FALSE;
   }
   else
   { 
    strcpy(szErr,"Serveur Anglais CONNECTE !\r\n");
    printf("%s",szErr);

    indiquerTCP("CON");
    
    strcpy(message,Message_Recu);
    len=strlen(message);
    
    SetTextColor(hDC,0x8F00);
    SetBkColor(hDC,0);
   
    Beep(500,100);
        
    strcpy(szErr,message);
    printf("%s\n",szErr); 

    intCheksum=fonctionCalculCsum(len,message);
    _itoa(intCheksum,strCheksum,10);
    //strCheksum[1]=0;
    //Attribution de la Cheksum à la fin du message
    strcat(message,strCheksum);
    //len=strlen(message);

    printf("Valeur cheksum : %d\n",intCheksum);

    //Message_Francais_A_Emettre=message;
    
    printf("Message : %s\n",message);
    //printf("Message_Francais_A_Emettre : %s\n",Message_Francais_A_Emettre);

    

    indiquerTCP_TRAMES_ANGLAISES(message);
     
    indiquerTCP_TRAMES_FRANCAISE(message); 

    //ConvertirTRAMES_ANGLAISES_EN_TRAMES_FRANCAISE(message);
    
   
    continuer=TRUE;

    }
  }

 closesocket(Desc_Socket_Cliente);
 WSACleanup();
 indiquerTCP( "END" );
 printf("\t\tOK:FIN RECEPTION TRAME SERVEUR ANGLAIS\r\n");
 //return 0;

}

/***********************************/
BOOL DemarreClientpourServeurAnglais(void)
/***********************************/
{
 
 DWORD ThreadId;
 //HANDLE hThread;
 ULONG hThread;
 char szErr[255];

 

 /*hThread = CreateThread
    (
     NULL,
     0,
     (LPTHREAD_START_ROUTINE)Fthread,
     NULL,
     0,
     &ThreadId
    );*/

 hThread=_beginthread(FthreadClientAnglais,0,&ThreadId);
 SetThreadPriority(HANDLE(hThread),THREAD_PRIORITY_HIGHEST);


 strcpy(szErr,"Tache Serveur Anglais demarree\r\n");
 printf("%s",szErr);

  // <- GT
 
 return TRUE;
}


Et voici mon code source du serveur avec lequel je dois renvoyer des trames sur les clients qui se connecteront.

#define Nb_Max_de_Client 10

/*************************************************/
void Fonction_Thread_Serveur(LPVOID param)
/*************************************************/
{
 char strTaille[20];
 //char *Message_Emis;
 int intTailleMessage;
 SOCKET Desc_Socket_Locale;
 int fin=FALSE;
 Desc_Socket_Locale=(SOCKET)param;

 while(!fin)
 {
  //Pour tests ->
  //printf("Reception message : %s",Message_Francais_A_Emettre);
  
  // <- Pour tests
  //Mettre une variable globale pour 'Message_Emis' ==> Message_Francais_A_Emettre
  if (Message_Francais_A_Emettre!=NULL)
  {
  //Message_Emis="$VHFDF,C,01DF51DC,FBE00B2E,156800,1800,2*40";
  printf("trame envoyee = %s\n",Message_Francais_A_Emettre);

  //size_t intTailleMessage = sizeof(Message_Emis);  
  intTailleMessage = strlen(Message_Francais_A_Emettre);    
  send(Desc_Socket_Locale,Message_Francais_A_Emettre,intTailleMessage ,0);   
  _itoa(intTailleMessage ,strTaille,10);
  //MessageBox(NULL,strTaille,"Taille de la trame",0);
  Message_Francais_A_Emettre=NULL;
  Sleep(5000);
  //getch();
  // GT Mis a vrai en temporaire ->
  }
  //fin=TRUE;
  // <- GT Mis a vrai en temporaire

 }
 closesocket(Desc_Socket_Locale);
}


/*************************************************/
BOOL DemarreServeurFrancais(void)
/*************************************************/
{
 int Code_Retour;
 SOCKET Desc_Socket_Connection;
 SOCKADDR_IN Adresse_Socket_Connection;
 WORD wVersionRequested;
 WSADATA wsaData;

 wVersionRequested=MAKEWORD(1,1);

 Code_Retour=WSAStartup(wVersionRequested,&wsaData);

 if(Code_Retour!=0)
 {
  perror("WSAStartup\t");
  //getch();
  WSACleanup();
  exit(errno);
 }
 printf("la version supportee est : %d.%d\n",
  LOBYTE(wsaData.wHighVersion),
  HIBYTE(wsaData.wHighVersion)
  );

 Desc_Socket_Connection=socket
  (
  AF_INET,
  SOCK_STREAM,
  0
  );

  printf("valeur de la socket = %d\n",Desc_Socket_Connection);

  ZeroMemory(&Adresse_Socket_Connection,sizeof(Adresse_Socket_Connection));
  Adresse_Socket_Connection.sin_family=AF_INET;
  Adresse_Socket_Connection.sin_port=htons(Spationav->intPortTCP);

  printf("Port TCP Client SPATIONAV : %d\n",Spationav->intPortTCP);

 Code_Retour=bind
  (
  Desc_Socket_Connection,
  (struct sockaddr*)&Adresse_Socket_Connection,
  sizeof(Adresse_Socket_Connection)
  );

 if(Code_Retour!=0)
 {
  perror("bind\t");
  //getch();
  closesocket(Desc_Socket_Connection);
  WSACleanup();
  exit(errno);
 }
 Code_Retour=listen(Desc_Socket_Connection,Nb_Max_de_Client);
 if(Code_Retour!=0)
 {
  perror("listen\n");
  WSACleanup();
  exit(errno);
 }
 printf("serveur Francais en attente d'une connection d'un client style SPATIONAV \n\n");
 //printf("***************arret du serveur par<CTRL><C>**************\n\n");

 //while(TRUE)
 //do
 {
  SOCKET * pt_Nouveau_Socket_Serveur;
  SOCKADDR_IN Adresse_Socket_Cliente;
  int Longueur_Adresse;
  HANDLE hthread;
  DWORD threadID;


  pt_Nouveau_Socket_Serveur = new SOCKET;

  Longueur_Adresse = sizeof(Adresse_Socket_Cliente);

  *pt_Nouveau_Socket_Serveur=accept
   (
   Desc_Socket_Connection,
   (struct sockaddr*)&Adresse_Socket_Cliente,
   &Longueur_Adresse
   );
  printf("connection accepte depuis le port client %d\n",
   ntohs(Adresse_Socket_Cliente.sin_port));
  hthread=CreateThread
   (
   NULL,
   0,
   (LPTHREAD_START_ROUTINE)Fonction_Thread_Serveur,
   (LPVOID)*pt_Nouveau_Socket_Serveur,
   0,
   &threadID
   );


 } 
 //}while(TRUE);

 return (0);
}

Comment puis-je associer mon client à une carte reseau et mon serveur à une autre carte reseau du même PC. (Je connais les 2 Adresses IP et les 2 ports TCP)

En esperant être assez clair.

Merci



Jeff.

jeudi 10 novembre 2005 à 14:42:00 | Re : Toujours besoin d'aide sur socket avec 2 cartes reseau

DeAtHCrAsH

Regarde dans mes codes sources tu y trouveras un exemple d'application client/serveur. J'y utilise des sockets asynchrones, ce qui pourra meme te permettre de te passer de tes threads. L'IP doit etre indiqué, lors du sin_addr. Shell


Cette discussion est classée dans : message, serveur, printf, socket, adresse


Répondre à ce message

Sujets en rapport avec ce message

Problème d'envoie par socket [ par CyberP ] J'ai fait un programme qui se connecte à un serveur ftp (le serveur ftp est aussi sur mon ordi). Je me connecte avec la fonction connect() et je recoi prob socket [ par flatou ] salutj'ai créé une appli serveur, banale : un client se connecte, il envoi un message et le serveur affiche le message.j'ai utilisé cela pour la recep connection client serveur avec MFC [ par Spiffou ] Bonjour à tous,j'avance petit à petit dans la programmation socket, mais je suis confronté à une nouvelle difficulté et j'ai une ou deux question sans protocole TCP HELP me [ par 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 socket client (php) vers serveur (c++) [ par suleyman ] bonjour, je suis debutant, je nai jamais programmer une socket et jaimerai avoir le code source ainsi que les commentaires dune socket client et serve [C] SOCKET [ par sda2 ] bonjour,en fait j'ai un petit problème avec les sockets en mode TCP...je programme un serveur multiclient, dans lequel, chaque client aura un traiteme 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 Programme sur les sockets en c++ builder 6 [ par fahdmustapha ] salut, j'aimerai avoir le code source de deux programmes en c++ builder 6 (serveur et client). le client:contien trois composants TClientSocket, TButt 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


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 2,777 sec (3)

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