Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > [SFML.Network] Le serveur ne veut pas recevoir le paquet > Lecture du sujet

[SFML.Network] Le serveur ne veut pas recevoir le paquet

La partie Client marche mais le serveur, le contraire !

Vous devez être inscrit pour pouvoir poster des messages

RésoluLe problème de ce sujet a été résolu

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne Hertzien' # Posté le 11/04/2008 à 18:41:22
C++, C++ fort !
Avatar
Groupe : Membres
Bonjour à tous les zéros,

J'ai voulu m'entrainer un peu sur le module SFML.Network que je trouve pas mal du tout ( :D ) pour faire une sorte d'un Mini-chat Client-Serveur et non P2P en console. Dès que je pourrai, je l'améliorerai et je le mettrai avec Qt prochainement.

Voilà mon code:



Le code du Client



Code : C++ - Afficher / masquer les numéros de ligne
  1. #ifndef __cplusplus
  2. #error "Ce code source est en C++ et non en C. Utilisez un Compilateur C++ s'il vous plaît"
  3. #endif
  4.  
  5. #define ToStr(x) #x
  6.  
  7. #include <iostream>
  8. #include <string>
  9.  
  10. #include <SFML/Network.hpp>
  11.  
  12. using std::cin;
  13. using std::cout;
  14. using std::endl;
  15. using std::flush;
  16. using std::cerr;
  17.  
  18. int main(int argc, char** argv)
  19. {
  20.     std::string Pseudo;
  21.     std::string Message;
  22.  
  23.     sf::IPAddress Serveur = "localhost";
  24.     sf::SocketTCP Client;
  25.  
  26.     cout << "Entrez votre pseudo: ";
  27.     getline(cin, Pseudo);
  28.     if(Pseudo.length() > 10) Pseudo.resize(10);
  29.     system("cls");
  30.  
  31.  
  32.     if(!Client.Connect(4500, Serveur)) {
  33.         cout << "Impossible de se connecter au serveur." << endl;
  34.         getchar();
  35.         return 1;
  36.     }
  37.     std::string RecuPseudo;
  38.     std::string RecuMessage;
  39.  
  40.     do
  41.     {
  42.         sf::Packet Packet;
  43.         sf::Packet PacketRecu;
  44.  
  45.         cout << endl << endl;
  46.         getline(cin, Message);
  47.  
  48.         if(Message == "/quit") break; // Si on a tapé QUE /quit, on arrête la boucle et on termine le programme.
  49.  
  50.         // Si le message dépasse les 5000 caractères
  51.         // On le coupe (Du genre ce que fait MSN =P)
  52.         if(Message.length() > 5000) Message.resize(5000);
  53.  
  54.  
  55.         cout << "Preparation du packet... ";
  56.         Packet.Clear();
  57.         if(!(Packet << Pseudo << Message)) // cf. FAQ Developpez SL_cin_verify
  58.         {
  59.             cout << "Impossible de preparer le packet.";
  60.             getchar();
  61.             break;
  62.         }
  63.         cout << "Ok" << endl;
  64.         cout << "Envoi du packet... ";
  65.  
  66.         if(Client.Send(Packet) != sf::Socket::Done)
  67.         {
  68.             cerr << "Impossible d'envoyer le paquet !" << endl;
  69.             getchar();
  70.             break;
  71.         }
  72.         cout << "Ok" << endl;
  73.  
  74.         cout << "Attente d'une reponse... ";
  75.         PacketRecu.Clear();
  76.         if(Client.Receive(PacketRecu) != sf::Socket::Done)
  77.         {
  78.             cerr << "Impossible de recevoir une reponse" << endl;
  79.             getchar();
  80.             break;
  81.         }
  82.         cout << "Ok" << endl;
  83.  
  84.  
  85.         PacketRecu >> RecuPseudo >> RecuMessage;
  86.  
  87.  
  88.         cout << '[' << RecuPseudo << "] " << RecuMessage << endl;
  89.     } while(true);
  90.  
  91.     return 0;
  92. }


Le code du Serveur



Code : C++ - Afficher / masquer les numéros de ligne
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4. #include <SFML/Network.hpp>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.     std::string RecuPseudo;
  11.     std::string RecuMessage;
  12.     std::string Temp;
  13.     std::vector<sf::SocketTCP> SocketsPrets;
  14.  
  15.  
  16.     sf::SocketTCP Serveur;
  17.     sf::SelectorTCP Selecteur;
  18.  
  19.     int Port = 4500;
  20.  
  21.     if (!Serveur.Listen(Port))
  22.     {
  23.         cerr << "Impossible d'ouvrir le port" << Port << "\n";
  24.     }
  25.     cout << "Ok ! Le serveur est pret:" << endl
  26.     << "Port utilise: " << Port << endl;
  27.  
  28.     Selecteur.Add(Serveur);
  29.  
  30.     while (true)
  31.     {
  32.         Selecteur.GetSocketsReady(SocketsPrets); // On récupère les sockets prêts
  33.  
  34.         for (std::vector<sf::SocketTCP>::iterator i = SocketsPrets.begin(); i != SocketsPrets.end(); ++i)
  35.         {
  36.             sf::SocketTCP Socket = *i;
  37.  
  38.             if (Socket == Serveur) // Si le socket s'est connecté
  39.             {
  40.                 sf::IPAddress AdresseClient;
  41.                 sf::SocketTCP Client;
  42.  
  43.                 Serveur.Accept(Client, &AdresseClient);
  44.                 cout << "Un client s'est connecte: " << AdresseClient << endl;
  45.                 Selecteur.Add(Client); // On l'ajoute au selecteur
  46.  
  47.             }
  48.             else
  49.             {
  50.                 sf::Packet Packet;
  51.                 if (Serveur.Receive( Packet ) == sf::Socket::Done)
  52.                 {
  53.                     Packet >> RecuPseudo >> RecuMessage; // On récupère le pseudo et le message
  54.  
  55.                    cout << '[' << RecuPseudo << ']' << endl
  56.                         << " a dit: " << endl << "\t\t" << RecuMessage << endl;
  57.  
  58.                     Packet << RecuPseudo << RecuMessage;
  59.                     if(Serveur.Send(Packet) != sf::Socket::Done)
  60.                     {
  61.                         cerr << "Impossible d'envoyer le paquet !" << endl;
  62.                     }
  63.                 }
  64.             }
  65.         }
  66.     }
  67.     return 0;
  68. }


Mon problème c'est que le client peut envoyer un packet mais le serveur ne peut pas recevoir ce paquet envoyé !
Pourtant si j'ai bien lu le code donné dans le tutoriel de la SFML, on peut recevoir un paquet sans avoir à en envoyer un avant.

Merci de votre réponse,
Si vous voulez plus d'explications, n'hésitez pas à me le demander :)
@+

Midoagent47, le Zéro Pointé du SdZ

Édité le 11/04/2008 à 20:02:48 par Hertzien'

Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne RaptorTeak # Posté le 11/04/2008 à 22:48:04
Avatar
Groupe : Membres
Salut !

Compiles-tu en release ? Le sélecteur bug à moitié en release sur la 1.2 (mais c'est toutefois fixé dans le svn)

Pour ceux qui veulent apprendre à se servir des déclencheurs de l'éditeur Warcraft III : c'est ici !

Une petite impro au piano que j'ai faite ^^

 
Hors ligne Hertzien' # Posté le 12/04/2008 à 14:23:40
C++, C++ fort !
Avatar
Groupe : Membres
Oui en release, bibliothèque en mode static.

Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne RaptorTeak # Posté le 12/04/2008 à 15:06:41
Avatar
Groupe : Membres
Essaie en débug et regarde si ça foire toujours :) . (oublie pas de linker avec les libs debug). Sinon utilise la version svn

Pour ceux qui veulent apprendre à se servir des déclencheurs de l'éditeur Warcraft III : c'est ici !

Une petite impro au piano que j'ai faite ^^

 
Hors ligne Hertzien' # Posté le 12/04/2008 à 18:32:28
C++, C++ fort !
Avatar
Groupe : Membres
Ok je vais essayer, mais est ce que je n'ai besoin que de linker -lsfml-network puisque je n'utilise que le module Network ? Merci pour vos réponses :)

EDIT: Apparement ça ne marche toujours, j'ai bien fait attention à tout pourtant :o
Édité le 12/04/2008 à 19:53:36 par Hertzien'

Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Hertzien' # Posté le 14/04/2008 à 16:58:20
C++, C++ fort !
Avatar
Groupe : Membres
Up ! Personne n'a jamais essayé de faire un chat avec les paquets par hazard ?

Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne RaptorTeak # Posté le 14/04/2008 à 17:04:28
Avatar
Groupe : Membres
bein il faut linker avec les libs de debug surtout ^^ (mais oui si tu fais que du réseau, tu linkes avec main et network et ça suffira :) ). Mais donc si ça ne marche toujours pas.... :/ . Je vais regarder ton code pour voir si y'a pas un truc qui cloche.

Pour ceux qui veulent apprendre à se servir des déclencheurs de l'éditeur Warcraft III : c'est ici !

Une petite impro au piano que j'ai faite ^^

 
Hors ligne Hertzien' # Posté le 14/04/2008 à 17:11:01
C++, C++ fort !
Avatar
Groupe : Membres
Oui j'ai bien linké les libs débug (-lsfml-network-d non ?) mais il y a toujours quelque chose qui cloche. Pouvez vous m'aider ? ^^

EDIT: J'ai relu attentivement le tutoriel et j'ai enfin compris ce qui clochait ! :D

Cependant je voudrais savoir comment faire pour qu'un message puisse être envoyé à tous les connectés ?
Édité le 14/04/2008 à 19:56:24 par Hertzien'

Notre équipe : C++ (au complet !)
SuperTux : Le jeu qui innove !
SFML - Anim : Ma classe C++ pour gérer les sprites SFML animés
 
Hors ligne Kreeg # Posté le 08/05/2008 à 18:54:23
Je mangerais bien du GNU...
Avatar
Groupe : Membres
http://www.google.fr/search?hl=fr&q=broadcast+UNIX+sockets&btnG=Recherche+Google&meta=

Le broadcasting doit surement être supporté par la SFML... Fouille la doc !

En mode Hard Rock (ACDC/GnR/VR §) - Slash et J. Petrucci sont mes héros \o/
Attention (va) aux (sur) messages (ce) subliminaux, (site) camarade !
Une question sur OpenGL, un problème ? Rejoignez #opengl sur EpikNet !
Dream Theater über alles §
La SDL pue grave, mais pas SFML !
« Whenever I feel like studying, I lie down until the feeling goes away »
Le modo qui ne connaissait pas Dimitri Borgur... :p


 
Hors ligne RaptorTeak # Posté le 09/05/2008 à 13:19:32
Avatar
Groupe : Membres
Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
Ce que je ferais moi, c'est de mettre tous les sockets (ou classe personnalisée contenant au moins les sockets) des clients dans un vector. Lors de la réception d'un message, tu itères ce vector (tu en utilises tous les éléments un par un), et à chaque fois tu envoies le message. (sinon, c'était quoi qui clochait?)

Pour ceux qui veulent apprendre à se servir des déclencheurs de l'éditeur Warcraft III : c'est ici !

Une petite impro au piano que j'ai faite ^^

 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 431 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.7565s (0.7321s)