[SFML/ réseau] Dialoguer par le reseau local Difficulté : 18/100
Publié le 23/02/2008 à 23h 23min par Marco565



Un émetteur/récepteur réseau en console



Requis:
Vous avez besoin de la lib de SFML 1.2 disponible ici. Et d'avoir lu son tutoriel les les communications réseau.

Cahier des charges:

  • L'utilisateur dois pouvoir choisir entre 2 modes : émetteur ou récepteur.

  • Si le mode émetteur est choisis, l'utilisateur doit rentrer l'adresse IP du destinataire.

  • Les communications se feront par UDP et par l'envoi de packet

  • Faire un boucle, tan que le message "exit" n'a été envoyé le programme ne dois pas s'arrêter


Aide
Si vous ne connaissez rien a SFML ni au réseau (pas besoin d'être un pro) je vous invite a aller voir les tutoriels officiels de SFML.

Correction
Le plus dur dans cet exercice est la boucle pour l'envoi de plusieurs messages, si vous n'y été pas arrivez réessayez sans la boucle (même si vous ne pouvez envoyer qu'un seul message a la fois c'est pas grave. En regardant la correction vous comprendrez. Bon assez parlé voici la correction:


Code : cpp
  1. #include <iostream>
  2. #include <SFML/Network.hpp>
  3.  
  4. #define PORT 4112
  5.  
  6. using namespace std;
  7. using namespace sf;
  8.  
  9.  
  10. void emeteur(string adresse = "127.0.0.1");
  11. void recepteur();
  12.  
  13. int main()
  14. {
  15. cout<<"Adresse cet l'ordinateur : "<<IPAddress::GetLocalAddress()<<endl;
  16. cout<<"Adresse du serveur virtuel "<<IPAddress::LocalHost<<endl;
  17. cout<<"1. Emeteur n2. Recepteur"<<endl;
  18. //On recupere le choix de l'utilisateur
  19. int choix;
  20. cin>>choix;
  21.  
  22. //On agit en cosequant
  23. if(choix == 1)
  24. {
  25. cout<<"Entrez l'adresse de l'ordinateur distant"<<endl;
  26. string adresse;
  27. cin>>adresse;
  28. emeteur(adresse);
  29. }
  30.  
  31. if(choix == 2)
  32. recepteur();
  33. return 0;
  34. }
  35.  
  36.  
  37. void emeteur(string adresse )
  38. {
  39. cout << "----EmEtEuR----" << endl;
  40.  
  41. //On definie l'adresse du serveur
  42. IPAddress addressServer = adresse;
  43.  
  44.  
  45. if(!addressServer.IsValid())
  46. {
  47. cout<<"L'adresse demandee n'est pas valide"<<endl;
  48. return;
  49. }
  50.  
  51. //On cree un socket pour emetre un message sur le reseau
  52. SocketUDP socket;
  53. string message = "Initiation de l'envoi de messages";
  54.  
  55.  
  56. do
  57. {
  58. //On cree un packet pour recevoir le message
  59. Packet packet;
  60. //demande a recupere le message
  61. getline(cin, message);
  62. //On met le message dans le packet
  63. packet<<message;
  64.  
  65. //On recupere le message
  66. if(socket.Send(packet, addressServer, PORT) != Socket::Done)
  67. cout<<"Erreur le message ne peut etre envoye"<<endl;
  68. else
  69. cout<<"Le message suivant a ete envoye n"<<message<<endl;
  70.  
  71. }
  72. while(message != "exit");
  73.  
  74.  
  75. system("PAUSE");
  76.  
  77. //On detruit le socket
  78. socket.Close();
  79. }
  80.  
  81. void recepteur()
  82. {
  83. cout << "----ReCePtEuR----" << endl;
  84.  
  85. //On cree un socket pour recevoir un message
  86. SocketUDP socket;
  87.  
  88. //On dis au socket d'arreter de bloquer le programme pour recevoir des donnees
  89. //socket.SetBlocking(false);
  90.  
  91. if(!socket.Bind(PORT))
  92. {
  93. cout<<"Impossible de se lie au port"<<endl;
  94. return;
  95. }
  96.  
  97. //On cree des variables pour acceuillir le message
  98. string message;
  99. size_t recived;
  100. IPAddress emeteur;
  101. do
  102. {
  103. Packet packet;
  104. //On recupere les messages
  105. if(socket.Receive(packet, emeteur) != Socket::Done)
  106. cout<<"Impossible de recevoir un message"<<endl;
  107.  
  108. packet >> message;
  109. cout<<"Vous avez recu le message suivant de : "<<emeteur<<"n"<<message<<endl;
  110.  
  111. }
  112. while(message != "exit");
  113.  
  114.  
  115. system("PAUSE");
  116.  
  117. //On detruit le socket
  118. socket.Close();
  119. }