Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Toujours besoin d'aide sur socket avec 2 cartes reseau [ Archives / Au secours ] (Jeff_Trek)

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é 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 Application Socket transfert fichiers [ par aymane2006 ] bjr en fait je cherche une application de transfert de fichiers,un ou plusieurs clients qui se connectent a un serveur,une fois la connection établie Erreur de segmentation d'un simple client http sous linux !! [ par nassimatique ] #include #include #include #include #include #include #include #define TAILLE 4096 <b Réalisation d'un Forum en C [ par narutofun123 ] BonjourJ'aimerai bien avoir un exemple "basic" d'un projet de réalisation d'un Forum en C sur un ensemble serveurs Unix basé sur l'architecture Client Message Asynchrone Socket [ par touys ] Bonjour , je réalise un programme en C++ d'un Client, mon Client doit traiter des messages asynchrones qu'il peut reçevoir, cependant je n'arrive pas


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.