Partage
  • Partager sur Facebook
  • Partager sur Twitter

SFML Network

Impossible d'envoyer des packets

Sujet résolu
    23 mars 2008 à 18:17:47

    Bonjour,

    Je me suis mis récemment au module réseau d'SFML , et au réseau en général.
    Seulement j'ai un soucis avec un code simple avec un client censé envoyer une chaine de caractères au serveur , ce dernier devant l'afficher sans succès , puisque visiblement le packet n'est pas reçu.
    Le socket client est pourtant fonctionnel et connecté au serveur , de même pour le serveur.

    j'ai cependant testé le statut sf::Socket::Disconnected du socket serveur et il visiblement considéré comme Disconnected , pourtant le teste du socket avec serveur.IsValid() m'indique que tout est ok.

    Voilà le code :

    Client :
    1. #include <iostream>
    2. #include <SFML/Network.hpp>
    3. int main()
    4. {
    5.     sf::SocketTCP client;
    6.     sf::Packet donnee;
    7.     donnee << "hello";
    8.     if (!client.Connect(7600, "192.168.1.126"))
    9.     {
    10.         std::cout << "impossible de se connecter a 192.168.1.126 sur le port 7600" << std::endl;
    11.     }
    12.     else
    13.     {
    14.         std::cout << "connecte au serveur" << std::endl;
    15.     }
    16.     if (client.Send(donnee)!= sf::Socket::Done)
    17.     {
    18.         std::cout << "impossible d'envoyer les donnees" << std::endl;
    19.     }
    20.     if (!client.IsValid())
    21.     {
    22.         std::cout << "connexion perdu" << std::endl;
    23.     }
    24.     getchar();
    25.     client.Close();
    26.     return EXIT_SUCCESS;
    27. }


    Serveur :
    1. #include <iostream>
    2. #include <SFML/Network.hpp>
    3. int main()
    4. {
    5.     sf::SocketTCP serveur;
    6.     sf::SocketTCP client;
    7.     sf::IPAddress adresseClient;
    8.     sf::Packet donnee;
    9.     std::string chaine;
    10.     if (!serveur.Listen(7600))
    11.     {
    12.         std::cout << "impossible d'ecouter sur le port 7600" << std::endl;
    13.     }
    14.     if (serveur.Accept(client, &adresseClient) != sf::Socket::Done)
    15.     {
    16.         std::cout << "erreur" << std::endl;
    17.     }
    18.     else
    19.     {
    20.         std::cout << "client connecte" << std::endl;
    21.     }
    22.     if (serveur.Receive(donnee) != sf::Socket::Done)
    23.     {
    24.         std::cout << "impossible de recevoir les donnees" << std::endl;
    25.     }
    26.     else
    27.     {
    28.         donnee >> chaine;
    29.         std::cout << chaine << std::endl;
    30.     }
    31.      if (!serveur.IsValid())
    32.     {
    33.         std::cout << "connexion perdu" << std::endl;
    34.     }
    35.     getchar();
    36.     serveur.Close();
    37.     return EXIT_SUCCESS;
    38. }


    Si vous avez la solution , merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      23 mars 2008 à 18:26:08

      1. if (!client.Connect(7600, "192.168.1.126"))

      A cet endroit là, tu dois passer une sf::IPAddress, donc pas une chaine de caractère. Il faut donc que tu fasses:
      1. sf::IPAddress adresse("192.168.1.126");
      2. if (!client.Connect(7600, adresse)){
      3. ...
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        23 mars 2008 à 18:42:58

        Citation : alecool

        1. if (!client.Connect(7600, "192.168.1.126"))


        A cet endroit là, tu dois passer une sf::IPAddress, donc pas une chaine de caractère. Il faut donc que tu fasses:

        1. sf::IPAddress adresse("192.168.1.126");
        2. if (!client.Connect(7600, adresse)){
        3. ...

        Les deux sont possibles. Utiliser une chaine de caractère directement est accepter car en C++ la construction automatique d'un objet sf::IPAddress est faisable.

        Tu peux indiquer les deux sorties que tu obtiens?
        Tu t'es bien inspiré de l'exemple http://www.sfml-dev.org/tutorials/network-sockets-fr.php ?
        • Partager sur Facebook
        • Partager sur Twitter
          23 mars 2008 à 18:58:15

          Citation : Pas de titre

          Tu peux indiquer les deux sorties que tu obtiens?



          Je ne suis pas sûr de comprendre :euh:

          Citation : Pas de titre

          Tu t'es bien inspiré de l'exemple http://www.sfml-dev.org/tutorials/network-sockets-fr.php ?



          Oui.

          Au passage je viens de me rendre compte que j'ai fait une erreur dans le titre , c'est au niveau de la réception qu'il y a visiblement problème.
          • Partager sur Facebook
          • Partager sur Twitter
            23 mars 2008 à 19:12:52

            Citation : hiura


            Les deux sont possibles. Utiliser une chaine de caractère directement est accepter car en C++ la construction automatique d'un objet sf::IPAddress est faisable.



            Merci, c'est bon à savoir!

            Autre piste: du coté du serveur, tu fais:
            1. serveur.Accept(client, &adresseClient) != sf::Socket::Done

            Ce qui me semble correcte, par contre, pour recevoir les données, il me semble que tu devrais faire:
            1. client.Receive(donnee) != sf::Socket::Done

            au lieu de:
            1. serveur.Receive(donnee) != sf::Socket::Done
            • Partager sur Facebook
            • Partager sur Twitter
              23 mars 2008 à 19:20:54

              Citation : Pas de titre

              Autre piste: du coté du serveur, tu fais:

              1. serveur.Accept(client, &adresseClient) != sf::Socket::Done


              C'est ce que je fais déjà , et le serveur a bien accepté le client.

              Citation : Pas de titre

              Ce qui me semble correcte, par contre, pour recevoir les données, il me semble que tu devrais faire:

              1. client.Receive(donnee) != sf::Socket::Done


              au lieu de:

              1. serveur.Receive(donnee) != sf::Socket::Done
              </citation>

              Ca ne marche pas =/.

              Edit : Erreur ça marche bien !J'avais juste oublier de modifier un message d'erreur , merci beaucoup :D
              • Partager sur Facebook
              • Partager sur Twitter
                23 mars 2008 à 19:29:24

                As-tu ouvert le routeur sur le port 7000 en TCP?
                Si tu veux tester, test en local (127.0.0.1).
                Hiura te demande la sortie (cout) des 2 programmes lros de leur exécution.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  23 mars 2008 à 20:19:12

                  Citation : Pole

                  Si tu veux tester, test en local (127.0.0.1).

                  Avec la SFML (je sais pas si c'est généralisable) sf::IPAddress("0") indique aussi l'adresse locale. Comme http://www.sfml-dev.org/documentation/classsf_1_1IPAddress.htm#c17d4ad5721ad2bbe5ab14fc1522668e .

                  Citation : Pole

                  Hiura te demande la sortie (cout) des 2 programmes lors de leur exécution.

                  Oui, c'est bien ça. Enfin, puisque c'est résolut c'est bon.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 mars 2008 à 21:10:54

                    Non là c'est c'est l'adresse par le réseau local, ce qui veut dire que le message va passer au routeur pour revenir au point de départ. Donc il faut ouvrir les ports.
                    En local (membre statique LocalHost), le message passe uniquement par le pare-feu de l'ordinateur. Sous linux, il n'y en a pas par défaut, sous Windows, le pare-feu prévient et peut autoriser le programme facilement.
                    Ca permet de savoir si c'est son prog qui a un problème ou le passage du message.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      23 mars 2008 à 21:23:05

                      Citation : Pole

                      Non là c'est c'est l'adresse par le réseau local

                      tu parles bien de sf::IPAddress("0") ? (j'aime pas les quiproquo ;) )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 mars 2008 à 17:33:22

                        0 correspond à l'adresse 0.0.0.0
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          24 mars 2008 à 18:07:11

                          Alors j'ai appris qqch! :)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          SFML Network

                          × 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