Partage
  • Partager sur Facebook
  • Partager sur Twitter

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

La partie Client marche mais le serveur, le contraire !

Sujet résolu
    11 avril 2008 à 18:41:22

    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



    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. #define ToStr(x) #x
    5. #include <iostream>
    6. #include <string>
    7. #include <SFML/Network.hpp>
    8. using std::cin;
    9. using std::cout;
    10. using std::endl;
    11. using std::flush;
    12. using std::cerr;
    13. int main(int argc, char** argv)
    14. {
    15.     std::string Pseudo;
    16.     std::string Message;
    17.     sf::IPAddress Serveur = "localhost";
    18.     sf::SocketTCP Client;
    19.     cout << "Entrez votre pseudo: ";
    20.     getline(cin, Pseudo);
    21.     if(Pseudo.length() > 10) Pseudo.resize(10);
    22.     system("cls");
    23.     if(!Client.Connect(4500, Serveur)) {
    24.         cout << "Impossible de se connecter au serveur." << endl;
    25.         getchar();
    26.         return 1;
    27.     }
    28.     std::string RecuPseudo;
    29.     std::string RecuMessage;
    30.     do
    31.     {
    32.         sf::Packet Packet;
    33.         sf::Packet PacketRecu;
    34.         cout << endl << endl;
    35.         getline(cin, Message);
    36.         if(Message == "/quit") break; // Si on a tapé QUE /quit, on arrête la boucle et on termine le programme.
    37.         // Si le message dépasse les 5000 caractères
    38.         // On le coupe (Du genre ce que fait MSN =P)
    39.         if(Message.length() > 5000) Message.resize(5000);
    40.         cout << "Preparation du packet... ";
    41.         Packet.Clear();
    42.         if(!(Packet << Pseudo << Message)) // cf. FAQ Developpez SL_cin_verify
    43.         {
    44.             cout << "Impossible de preparer le packet.";
    45.             getchar();
    46.             break;
    47.         }
    48.         cout << "Ok" << endl;
    49.         cout << "Envoi du packet... ";
    50.         if(Client.Send(Packet) != sf::Socket::Done)
    51.         {
    52.             cerr << "Impossible d'envoyer le paquet !" << endl;
    53.             getchar();
    54.             break;
    55.         }
    56.         cout << "Ok" << endl;
    57.         cout << "Attente d'une reponse... ";
    58.         PacketRecu.Clear();
    59.         if(Client.Receive(PacketRecu) != sf::Socket::Done)
    60.         {
    61.             cerr << "Impossible de recevoir une reponse" << endl;
    62.             getchar();
    63.             break;
    64.         }
    65.         cout << "Ok" << endl;
    66.         PacketRecu >> RecuPseudo >> RecuMessage;
    67.         cout << '[' << RecuPseudo << "] " << RecuMessage << endl;
    68.     } while(true);
    69.     return 0;
    70. }


    Le code du Serveur



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


    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

    • Partager sur Facebook
    • Partager sur Twitter
      11 avril 2008 à 22:48:05

      Salut !

      Compiles-tu en release ? Le sélecteur bug à moitié en release sur la 1.2 (mais c'est toutefois fixé dans le svn)
      • Partager sur Facebook
      • Partager sur Twitter
        12 avril 2008 à 14:23:40

        Oui en release, bibliothèque en mode static.
        • Partager sur Facebook
        • Partager sur Twitter
          12 avril 2008 à 15:06:42

          Essaie en débug et regarde si ça foire toujours :) . (oublie pas de linker avec les libs debug). Sinon utilise la version svn
          • Partager sur Facebook
          • Partager sur Twitter
            12 avril 2008 à 18:32:29

            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
            • Partager sur Facebook
            • Partager sur Twitter
              14 avril 2008 à 16:58:21

              Up ! Personne n'a jamais essayé de faire un chat avec les paquets par hazard ?
              • Partager sur Facebook
              • Partager sur Twitter
                14 avril 2008 à 17:04:29

                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.
                • Partager sur Facebook
                • Partager sur Twitter
                  14 avril 2008 à 17:11:02

                  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 ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    8 mai 2008 à 18:54:23

                    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 !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 mai 2008 à 13:19:32

                      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?)
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown