Echange de donées entre deux applications en réseau

Signaler
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011
-
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011
-
j'expose mon soucis, j'ai deux pc en réseau, ils tournent avec XP Pro. j'ai programmé deux applications (une sur chaque pc) avec visual studio 2005 en C++. Voila le problème, la première doit envoyer des données à la deuxième. La deuxième traite les données et renvoi les résultats à la première. Si quelqu'un pouvais m'aider à trouver comment faire cela... parce que la j'en ai marre. pour info, j'ai essayé les fichiers masqués mais ca marche que si les applications sont lancées sur le même PC.
Merci d'avance.

12 réponses

Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
Salut, il faut utiliser les sockets. Cherche, il y a plein d'exemple d'utilisation de WinSock (librairie permettant d'exploiter les sockets sous Windows).
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011

ok je vais chercher dans ce sens la. merci a toi darunia
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
tu peux aussi mapper des fichiers sur le PC distant.

louis14
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011

Je peux mapper a distance, ca je sais. mais je n'arrive pas à mapper deux .exe qui n'ont pas le même nom (deux processus distincts). ce serais sympa de me mettre sur la voie.
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
Mais voyons, on n'utilise pas des fichiers pour faire communiquer des processus distant.
Il faut utiliser des sockets !

 [mailto:pD@runia D@runia]
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011

Le socket fonctionne en communication. mais toujours un petit hic : je transmet trois données et la dernière transmise écrase les deux autres. la partie de code ou je pense fais défaut, ca donne:
...
for(int i=0;i<3;i++)
{
   ...
   if(i = = 0)   var1 = buffer;
   if(i = = 1)   var2 = buffer;
   if(i = = 2)   var3 = buffer;
}
...
j'espère que c'est suffisant sinon, je verrais pour en mettre plus si mon maitre de stage est d'accord...
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011

char
* parametres[3];<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>






 







                       
 

// Définition 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;                                                                                                     // Variable temporaire de type int






                       
 
int nombre_de_caractere;                                                                                 // Indique le nombre de caractères qui a été reçu ou envoyé






                       
 
char buffer[5];                                                                                          // Tampon contenant les données reçues ou envoyées






                       
 SOCKET id_de_la_socket;                                                                                  // Identifiant de la socket






                       
 SOCKADDR_IN information_sur_la_source;                                                             // Déclaration de la structure des informations lié à l'écoute






 







                       
 
// Initialisation de Winsock







                       
 erreur=WSAStartup(MAKEWORD(2,2),&initialisation_win32);






                       
 
if (erreur!=0)






                            
 MessageBox::Show("Désolé, initialisation Winsock impossible","Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);






           








                       
 
// Ouverture d'une Socket







                       
 id_de_la_socket=socket(AF_INET,SOCK_DGRAM,0);






                       
 

if
(id_de_la_socket==INVALID_SOCKET)






                            
 

MessageBox::Show("Désolé, création du socket impossible","Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);






     








                       
 
// Lie la socket à une ip et un port d'écoute







                       
 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(33333);                                             // Ecoute sur le port 33333






                       
 erreur=bind(id_de_la_socket,(struct sockaddr*)&information_sur_la_source,sizeof(information_sur_la_source));






                       
 
if (erreur!=0)






                            
 MessageBox::Show("Désolé, écoute ce port impossible","Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);






 







                       
 
// Reception des données







                       
 
for(int i=0;i<3;i++)






                       
 {






                            
 tempo=sizeof(information_sur_la_source);                                                     // Passe par une variable afin d'utiliser un pointeur






                            
 nombre_de_caractere=recvfrom(id_de_la_socket,buffer,1515,0,(struct sockaddr*)&information_sur_la_source,&tempo);






                            
 buffer[nombre_de_caractere]=0;                                                                     // Permet de fermer le tableau après le contenu des data, car la fonction recvfrom ne le fait pas






           








                            
 

String ^attente = gcnew String(buffer);






                            
 MessageBox::Show("buffer " + attente + " ; i " + i);






                            
 








                            
 parametres[i] = buffer;






                            
 








                            
 String ^atpar0 = gcnew String(parametres[0]);






                            
 String ^atpar1 = gcnew String(parametres[1]);






                            
 String ^atpar2 = gcnew String(parametres[2]);






                            
 








                            
 

MessageBox::Show("parametres0 = " + atpar0);






                            
 MessageBox::Show("parametres1 = " + atpar1);






                            
 MessageBox::Show("parametres2 = " + atpar2);






                       
 }






                       
 








                       
 
// Fermeture de la socket correspondant à la commande socket()







                       
 erreur=closesocket(id_de_la_socket);






                       
 
if (erreur!=0)






                            
 MessageBox::Show("Désolé, libération du socket impossible","Erreur",MessageBoxButtons::OK,MessageBoxIcon::Error);






 







                       
 

String ^numTest = gcnew String(parametres[0]);






                       
 String ^valRes = gcnew String(parametres[1]);






                       
 String ^valTemps = gcnew String(parametres[2]);






 







                       
 MessageBox::Show("numTest : " + numTest);






                       
 MessageBox::Show("valRes : " + valRes);






                       
 

MessageBox::Show("valTemps : " + valTemps);






 







                       
 test::Form1::Text += "Console de test " + numTest;






 







                       
 
//Affichage des arguments dans un label







 







                       
 label1->Text += "Valeur résistance : ";






                       
 label1->Text += valRes;






                       
 

label1->Text += " Ohm(s)";






                       
 label1->Text += "\n\n";






                       
 

label1->Text += "Valeur échantillonage : ";






                       
 label1->Text += valTemps;






                       
 

label1->Text += " Seconde(s)";






                       
 label1->Text += "\n\n";






                       
 label1->Text += "N° du test : ";





                       
 

label1->Text += numTest;

voila le code...
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
D'abord, je vois que ton code est en .net.
Dans ce cas, il vaudrait mieux utiliser les classes du framework qui se trouvent dans System.Net.Socket.

Ensuite, je te conseille d'utiliser des acquitements. Concretement, envoyer un octet à l'envoyeur une fois que la donnée a été reçue. Ca permet de bien synchroniser le client et le serveur.

[mailto:D@runia D@runia]
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011

c'est ce que j'ai fais et ca marche. merci pour votre aide précieuse. une dernier chose : j'aimerais attendre la fermeture de la form2 pour poursuivre le code de la form1 qu'il y a après l'appel de la procédure qui ouvre la form2. merci encore...
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011

ta l'air d'en connaitre un bout darunia. je débute tout juste dans l'objet. je ne maitrise pas du tout les classe, du moins pas encore.
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
2
Tu utilises des objets s'en meme t'en rendre compte on dirait !
Quand tu fais String^ str = gcnew String("toto"), str est un Objet String.

Es tu conscient que tu fais du C++ .net et pas du C++ ?

Sinon il faut que tu ouvres form2 (nomme tes fenetre mieux que ça) en modale.
Pour cela il faut utiliser la méthode ShowDialog plutot que la méthode Show pour afficher ta fenetre form2.

[mailto:D@runia D@runia]
Messages postés
29
Date d'inscription
samedi 22 octobre 2005
Statut
Membre
Dernière intervention
21 mars 2011

ou ca ouin j'en suis conscient. mais ca n'empèche qu'il faut bien commencer quelque part... Je sais ce qu'est un objet. mais je sais pas tous les utiliser.merci de ton aide...