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

youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011 - 7 juin 2007 à 16:17
youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011 - 14 juin 2007 à 14:48
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

cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
7 juin 2007 à 20:25
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).
0
youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011
8 juin 2007 à 09:16
ok je vais chercher dans ce sens la. merci a toi darunia
0
cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
9 juin 2007 à 09:07
tu peux aussi mapper des fichiers sur le PC distant.

louis14
0
youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011
12 juin 2007 à 16:33
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
12 juin 2007 à 20:31
Mais voyons, on n'utilise pas des fichiers pour faire communiquer des processus distant.
Il faut utiliser des sockets !

 [mailto:pD@runia D@runia]
0
youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011
13 juin 2007 à 08:12
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...
0
youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011
13 juin 2007 à 09:40
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...
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
13 juin 2007 à 13:03
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]
0
youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011
13 juin 2007 à 14:44
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...
0
youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011
13 juin 2007 à 14:49
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.
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
13 juin 2007 à 19:06
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]
0
youdream Messages postés 29 Date d'inscription samedi 22 octobre 2005 Statut Membre Dernière intervention 21 mars 2011
14 juin 2007 à 14:48
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...
0
Rejoignez-nous