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

Auteur Sujet: Impossible à une connexion extérieure de se connecter à mon programme..  (Lu 2438 fois)

0 Membres et 1 Invité sur ce sujet

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Salut à tous,

Alors voilà, j'ai développé une petite application permettant que 2 personnes puissent, depuis leur PC, déplacer un personnage animé avec les touches fléchées.

Le programme fonctionne parfaitement bien en local ou même en wifi avec mon PC de bureau - PC portable, avec l'ip de la box 168.0.0.25 ..

Néanmoins, après avoir renseigné mon adresse IP fixe pour que la connexion se fasse depuis l'extérieur, il ne se passe rien..

Lorsque j'envoi mon programme à un pote par email et que je lui demande de se connecter, il ne se passe rien, pourtant, j'ai ouvert le port que j'utilise ( 2000 ) depuis ma box SFR, mais impossible pour mon pote de se connecter lorsque je lance le serveur..

Merci à tous de bien vouloir m'éclairer sur ce problème.

Voici le code, sait-on jamais :

#include <iostream>

#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>

using namespace std;
using namespace sf;

int main()
{
    string ip = "85.***.**.**2";
    TcpSocket socket;

    cout << ip << endl;

    char connectionType;
    bool updateScreen;

        cout << "(s) pour serveur /  (c) pour client : ";
        cin >> connectionType;

    if (connectionType == 's')
    {
        TcpListener listener;
        listener.listen(2000);
        listener.accept(socket);
    }

    if (connectionType == 'c')
    {
        socket.connect(ip, 2000);
    }

    RenderWindow app(VideoMode(800,600,32),"SFML_Packets");

    Clock clock;

    Texture perso;
    perso.loadFromFile("mario.png");
    Sprite S1(perso), S2(perso);
    Vector2f prevPosition, p2Position;

    Vector2f position(800/2, 600/2);

    Vector2f anim, p2Anim;
    enum dir {up, right, down, left };
    enum p2Dir {up2, right2, down2, left2 };

    S1.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));
    S2.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));

    anim.x = 0;
    anim.y = down;

    p2Anim.x = 0;
    p2Anim.y = down2;

    float speed = 3;

    View view;

    socket.setBlocking(false);

    while (app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            if (event.type == Event::Closed)
                app.close();
            if (event.type == Event::GainedFocus)
                updateScreen = true;
            if (event.type == Event::LostFocus)
                updateScreen = false;
        }

        prevPosition = S1.getPosition();
        position.x = S1.getPosition().x + 12 - (800/2);
        position.y = S1.getPosition().y + 16 - (600/2);

        if (updateScreen)
        {
            if (Keyboard::isKeyPressed(Keyboard::Up) && clock.getElapsedTime().asMilliseconds()>100)
            {
                S1.move(0, -speed);
                anim.y = up;
                anim.x++;
                if (anim.x>2)
                    anim.x = 0;
                clock.restart();
            }
            if (Keyboard::isKeyPressed(Keyboard::Down) && clock.getElapsedTime().asMilliseconds()>100)
            {
                S1.move(0, speed);
                anim.y = down;
                anim.x++;
                if (anim.x>2)
                    anim.x = 0;
                clock.restart();
            }
            if (Keyboard::isKeyPressed(Keyboard::Left) && clock.getElapsedTime().asMilliseconds()>100)
            {
                S1.move(-speed, 0);
                anim.y = left;
                anim.x++;
                if (anim.x>2)
                    anim.x = 0;
                clock.restart();
            }
            if (Keyboard::isKeyPressed(Keyboard::Right) && clock.getElapsedTime().asMilliseconds()>100)
            {
                S1.move(speed, 0);
                anim.y = right;
                anim.x++;
                if (anim.x>2)
                    anim.x = 0;
                clock.restart();
            }

            if(Keyboard::isKeyPressed(Keyboard::Escape))
                app.close();

                S1.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));
        }

        Packet packet;

        if (prevPosition != S1.getPosition())
        {
            packet << S1.getPosition().x << S1.getPosition().y << anim.x << anim.y;
            socket.send(packet);
        }

        socket.receive(packet);

        if (packet >> p2Position.x >> p2Position.y >> p2Anim.x >> p2Anim.y )
        {
            S2.setPosition(p2Position);
            S2.setTextureRect(IntRect(p2Anim.x*24, p2Anim.y*32, 24, 32));
        }

        app.clear();

        view.reset(FloatRect(position.x, position.y, 800, 600));

        app.setView(view);

        app.draw(S1);
        app.draw(S2);

        app.display();
    }
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Impossible à une connexion extérieure de se connecter à mon programme..
« Réponse #1 le: Janvier 19, 2017, 05:19:40 pm »
Je ne pense vraiment pas que ce soit le code, surtout si ça marche en réseau local. Soit le port forwarding a mal été fait, soit l'un ou l'autre pare-feu bloque la connexion.
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Impossible à une connexion extérieure de se connecter à mon programme..
« Réponse #2 le: Janvier 19, 2017, 06:33:28 pm »
Bonsoir  Laurent,
Comment faire pour vérifier si le problème vient bien de l'ouverture du port ? ( mon firewall est pourtant bien désactivé pour les essais )
Merci !
« Modifié: Janvier 19, 2017, 07:10:02 pm par Slash94 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Impossible à une connexion extérieure de se connecter à mon programme..
« Réponse #3 le: Janvier 19, 2017, 08:23:40 pm »
Commence déjà par diagnostiquer l'erreur : je vois que dans ton code tu ne vérifies le retour d'aucun appel aux fonctions réseau. Celles-ci renvoient quelque chose, ce n'est pas pour rien.

Ensuite les pare-feux ont des logs ou autre, il me semble que tu peux vérifier si une tentative de connexion a été bloquée.

En ce qui concerne l'ouverture de port, je ne sais pas comment tester.
« Modifié: Janvier 19, 2017, 08:25:12 pm par Laurent »
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Impossible à une connexion extérieure de se connecter à mon programme..
« Réponse #4 le: Janvier 22, 2017, 09:32:40 pm »
Salut Laurent,

Je ne sais pas comment ni pourquoi, mais par l'opération d'un miracle, le lendemain matin mon port était libre alors que j'ai laissé le PC tourner toute la nuit et que je n'ai rien fermé de particulier..Bref, ça fonctionne..

janf

  • Newbie
  • *
  • Messages: 45
    • Voir le profil
Re : Impossible à une connexion extérieure de se connecter à mon programme..
« Réponse #5 le: Février 03, 2017, 01:07:05 pm »
Je vois que le problème est résolu. Mais je te pose une réponse au cas où à l'avenir.

Si tu es sous windows tu as du avoir une fenêtre qui s'est ouverte pour demander si ton programme pouvait accéder au réseau. Quelque soit ton pare-feu logiciel tu peux quelque part y paramétrer les autorisations pour chaque programme.

Mais le problème venait plus probablement de ton pare-feu matériel, la box derrière laquelle tes ordinateurs sont branchés pour accéder à Internet (je suppose que c'est le cas, que tu es derrière une box). C'est dans la configuration de cette box que tu doit faire des redirections de port, par exemple lui dire que lorsqu'elle reçoit une requête depuis l'extérieur sur le port P, elle relaye la requête vers l'IP 192.160.0.X, celle de ta machine sur laquelle le serveur du jeu tourne, sur le port P.

Autrement, une solution plus rapide, si la configuration du pare-feu de ta box te propose de mettre une adresse en DMZ, tu peux y mettre l'adresse locale de ta machine (192.168.0.X) et elle sera accessible depuis l'extérieur sur tous les ports (sauf ceux qui ont été redirigés vers une autre adresse, je pense).