IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[SFML][RESEAU] Impossible d'envoyer un paquet


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Par défaut [SFML][RESEAU] Impossible d'envoyer un paquet
    Bonjour à tous,

    Je viens vous demander de l'aide pour tenter de me débloquer sur un problème dont je ne vois pas l'origine.

    Concrètement, je ne comprend pas pourquoi mon programme arrive à lancer et recevoir un premier paquet mais ensuite il refuse catégoriquement d'en envoyer d'autres...

    Voici donc mon programme en 2 parties :

    Connection.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    #include <SFML/Graphics.hpp>
    #include <SFML\Network.hpp>
    #include <iostream>
    #include <sstream>
     
    sf::TcpSocket socket;
    sf::IpAddress ip = sf::IpAddress::getPublicAddress();
    sf::TcpListener listenner;
     
    sf::Packet packet;
     
    sf::Http http("---ADRESSE DE MON SERVEUR---");
    sf::Http::Request request;
    sf::Http::Response response;
    std::ostringstream stream;
    sf::Socket::Status status;
     
    char choix, mode = 'n';
    char buf[2000];
    std::string text,textRep;
    std::string repServ, ligne;
     
    void connection(){
     
        request.setMethod(sf::Http::Request::Post);
     
        std::cout << "Votre ip : " << ip << std::endl;
     
        std::cout << "Etre le Serveur : s | Etre le Client : c" << std::endl;
        std::cin >> choix;
     
        if (choix == 'c'){
     
            mode = 's';
     
            std::cout << "Vous etes un Client" << std::endl;
     
            std::cout << "CONNEXION EN COURS..." << std::endl;
     
            request.setUri("/index.php");
            response = http.sendRequest(request);
     
            repServ = response.getBody();
            std::istringstream lin(repServ);
     
            std::cout << "RECHERCHE DE SERVEUR EN COURS..." << std::endl;
     
            std::getline(lin, ligne);
            status = socket.connect(ligne, 2000);
     
            while (status != sf::Socket::Done){
     
                std::getline(lin, ligne);
                if (ligne == ""){
                    std::cout << "Aucun serveur disponible" << std::endl;
                    break;
                }
     
     
                status = socket.connect(ligne, 2000);
     
            }
     
            text = "Connection avec le client reussi !";
            packet << text;
     
        }
        else if (choix == 's'){
     
            mode = 'r';
     
            std::cout << "Vous etes le serveur" << std::endl;
     
            request.setUri("/addServ.php");
     
            stream << "ip=" << ip;
            request.setBody(stream.str());
            response = http.sendRequest(request);
            std::cout << "RECHERCHE D'UN CLIENT EN COURS..." << std::endl;
            listenner.listen(2000);
            listenner.accept(socket);
            std::cout << "SOCKET ACCEPTE" << std::endl;
     
            text = "CECI EST ENVOYE DEPUIS LE SERVEUR";
            packet << text;
        }
        else{ 
            std::cout << "OKTAMER" << std::endl;
     
        }
     
    }
     
    void decoBdd(std::string ipp){
     
        request.setUri("/delServ.php");
        response = http.sendRequest(request);
     
    }

    Source.cpp


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    #include <SFML/Graphics.hpp>
    #include <SFML\Network.hpp>
    #include <iostream>
    #include <sstream>
    #include <string>
    #include "TileMap.h"
    #include "Connection.h"
     
    //sf::RenderWindow window(sf::VideoMode(800, 600), "Test MAP !");
     
    //TileMap map;
     
    int main()
    {
     
        /*const int maap[] = 
        {
            154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
            154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
            154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
            160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160,
            170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170,
            154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
            154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154
        };
     
        map.load("tiles.png", sf::Vector2u(32, 32), maap, 22, 7);
     
        while (window.isOpen())
        {
            sf::Event event;
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::Closed)
                    window.close();
            }
     
            window.clear();
            window.draw(map);
            window.display();
        }*/
     
        connection();
     
        socket.send(packet);
        socket.receive(packet);
        packet >> textRep;
        std::cout << textRep << std::endl;
     
        std::cin.ignore();
     
        decoBdd(ligne);
     
        std::cout << "--<§> TCHAT TEST <§>--" << std::endl;
        std::cout << "Envoyer '-1' pour quitter le Tchat" << std::endl;
     
        while (text != "-1"){
     
            text="";
            textRep="";
            sf::Packet packet2;
     
            if (mode == 's'){
     
                std::cout << "VOTRE TEXT : " << std::endl;
                std::getline(std::cin, text);
     
                packet2 << text;
     
                    if (socket.send(packet2)){
                        mode = 'r';
                    }
                    else{ std::cout << "ERREUR DANS L'envoie" << std::endl; }
     
            }
            else if (mode == 'r'){
     
                socket.receive(packet2);
                std::cout << "A" << std::endl;
     
                if (packet2 >> textRep){
     
                    std::cout << "B" << std::endl;
                    std::cout << textRep << std::endl;
                    std::cout << "C" << std::endl;
                    mode = 's';
     
                }
                else{ std::cout << "ERREUR DANS LA RECEPTION" << std::endl; }
     
            }
            else{
                return 0;
            }
     
            std::cout << "---------------" << std::endl;        
     
        }
     
        std::cout << "CONNEXION TERMINEE" << std::endl;
     
        system("pause");
     
        return 0;
    }

    Merci infiniment d'avance !

    Cdlm,

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Par défaut
    J'ai oublié de vous donner les détails de l'erreur...

    Le programme bloque à la ligne 70 -73 du Source.cpp puisque if (socket.send(packet2)) return false...


    Donc pour une raison inconnue, le packet n'est pas envoyé.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    La doc dit que ça échoue si le socket n'est pas connecté.
    Tu es sûr que ton connect réussit ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Par défaut
    Oui, le socket est bien connecté.
    J'ai partiellement trouvé le problème car je me suis trompé dans la condition, il faut utiliser if (socket.send(packet2) == sf::Socket::Done) ).
    Cependant maintenant impossible de récupérer le packet... J'obtiens des magnifiques : "ERREUR DANS LA RECEPTION".

  5. #5
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Question peut-être conne mais et-tu certain que ton serveur envoi un packet ?

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Par défaut
    Oui car le client reçoit bien le premier le packet et l'affiche.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 46
    Par défaut
    J'ai simplifié au maximum le code et je me suis très fortement inspiré de l'exemple du tchat dans le wiki mais là, c'est encore plus bizarre car je peux envoyer UN paquet ( qui marche, il reçu de l'autre coté ) mais après tout reste bloqué sur le receive() qui au bout d'un moment rend la main ( alors que le socket n'a rien reçu et après la fonction receive() est 'ignoré' car elle renvoie toujours un code différent du Socket:one...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
        while (text != "-1"){
     
            std::string textS = "";
            sf::Packet packS;
            std::getline(std::cin, textS);
            packS << textS;
            socket.send(packS);
     
            std::string textR = "";
            sf::Packet packR;
            socket.receive(packR);
            if (packR >> textR){
                if (!textR.empty()){
                    std::cout << textR << std::endl;
                }
            }
     
        }

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 528
    Par défaut
    Je ne connais pas SFML mais moi, j'utiliserai la méthode golgoth : je regarde avec un sniffer réseau (Wireshark ou autre) ce qui passe sur le câble.

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/09/2014, 22h41
  2. Réponses: 5
    Dernier message: 05/06/2008, 22h43
  3. [Mail] Impossible d'envoyer un mail
    Par bugalood dans le forum Langage
    Réponses: 4
    Dernier message: 17/09/2005, 02h38
  4. Impossible de supprimer un paquet
    Par aliasjcdenton dans le forum Debian
    Réponses: 4
    Dernier message: 14/02/2005, 16h28
  5. Réponses: 33
    Dernier message: 30/03/2004, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo