Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [SFML][RESEAU] Impossible d'envoyer un paquet  (Lu 3519 fois)

0 Membres et 2 Invités sur ce sujet

Platon

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
    • E-mail
[SFML][RESEAU] Impossible d'envoyer un paquet
« le: Janvier 11, 2015, 06:09:54 pm »
Amis du soir, bonsoir !

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

#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



#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,

Platon

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
    • E-mail
Re : [SFML][RESEAU] Impossible d'envoyer un paquet
« Réponse #1 le: Janvier 11, 2015, 07:21:29 pm »
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é.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML][RESEAU] Impossible d'envoyer un paquet
« Réponse #2 le: Janvier 11, 2015, 07:49:12 pm »
Relis attentivement la documentation, les tutoriels et les exemples des fonctions que tu utilises.
Laurent Gomila - SFML developer

Platon

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
    • E-mail
Re : [SFML][RESEAU] Impossible d'envoyer un paquet
« Réponse #3 le: Janvier 11, 2015, 08:56:51 pm »
Ah oui effectivement, autant pour moi ! ( il faut utiliser "if (socket.send(packet2) == sf::Socket::Done)" )
Donc maintenant le packet est bien envoyé mais jamais reçu...

Et là, je relis encore là doc en ce moment et je vois pas. Pourtant le premier packet qui confirme la connexion passe... J'ai check que le socket est bien connecté... à s'en arracher les cheveux.

Et du coup, j'obtiens une boucle de : "ERREUR DANS LA RECEPTION" pour le 'serveur' et le client (vu qu'il passe en mode 'réception')
Mais du coup, c'est encore plus bizarre puisque normalement il devrait bloquer sur le socket.receive() comme le serveur n'a rien pu envoyer...

En tout cas, merci pour la réponse et bravo pour le développement de cette magnifique Library ( OMG enfin fini les 36 modules de sdl... )

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML][RESEAU] Impossible d'envoyer un paquet
« Réponse #4 le: Janvier 12, 2015, 08:57:11 pm »
Tu testes toujours mal, voire pas du tout, le retour des fonctions send et receive.
Laurent Gomila - SFML developer

Platon

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
    • E-mail
Re : [SFML][RESEAU] Impossible d'envoyer un paquet
« Réponse #5 le: Janvier 14, 2015, 05:16:56 pm »
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::Done...

        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;
                        }
                }

        }
 

PS : un grand merci à Laurent pour son infini patience.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML][RESEAU] Impossible d'envoyer un paquet
« Réponse #6 le: Janvier 14, 2015, 07:56:27 pm »
Et sinon qu'est-ce que tu penserais de... je sais pas... tester correctement le retour de tes fonctions send et receive ? Ah je l'ai déjà dit 3 fois ? Pardon :P

Citer
un grand merci à Laurent pour son infini patience.
Si ça continue comme ça tu risques de bientôt voir la limite de mon infinie patience ;D
Laurent Gomila - SFML developer

Platon

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
    • E-mail
Re : [SFML][RESEAU] Impossible d'envoyer un paquet
« Réponse #7 le: Janvier 14, 2015, 11:01:16 pm »
Je crois que ça vient pas du code en faite...
Juste pour voir, j'ai test en getLocalAdress() et ça marche !!!

Mais là ou je ne comprends pas du tout, c'est quand local tout marche au poil...
Mais en public, il n'y a qu'UN SEUL packet qui passe... JUSTE UN !

J'ai crée un petit test avec 2 carrés dont le rouge est contrôlé par le joueur ( enfin dans sa fenêtre ) et le bleu est le carré dirigé par l'autre joueur via le réseau.

Et bien, en local les 2 carrés sont bien synchronisés pas de problème.

Et en public ça donne ça :

On voit que le carré bleu a bougé de quelques pixels ( UN paquet ) puis plus rien...

Donc si vous avez des idées sur la config de la box ou autres... En sachant que désactiver le firewall n'a rien changé...