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

Auteur Sujet: Problème de communnication client/serveur  (Lu 4730 fois)

0 Membres et 1 Invité sur ce sujet

Ellpower

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Problème de communnication client/serveur
« le: Février 10, 2013, 12:43:51 am »
Mon serveur reçoit le packet envoyé par mon client mais le client ne reçoit pas le packet envoyer du serveur.

- J'ai fais le port fowarding vers mon pc pour le port 14532.
- Mon serveur et mon client son exécuter sur la même machine.
- Mon ip local est 192.168.0.102

Mon but est de faire un petit chat en ligne. Normalement, je devrais utiliser TCP mais ce n'est que pour la pratique.

Voici le code serveur:
// ***************************************************************************************

#include <iostream>

// ***************************************************************************************

#include <sfml/network.hpp>

// ***************************************************************************************

using namespace std;
using namespace sf;

// ***************************************************************************************

void NetworkListener(void *Data)
{
    SocketUDP Receiver;
    Packet m;
    IPAddress Address;
    unsigned short port = 14532;

    Receiver.Bind(port);

    int i;

    while (true)
    {
        Receiver.Receive(m, Address, port);
        m >> i;

        if(i == 104)
        {
            cout << "Received from client" << endl;
            SocketUDP Sender;
            Packet packet;
            packet << 105;
            Sender.Send(packet, Address, port);
            Sender.Close();
        }
    }
    Receiver.Close();
}

Thread NetworkListener_THREAD(&NetworkListener);

// ***************************************************************************************

string ToLower(string s)
{
    unsigned int a = s.size();
    for (unsigned int i = 0; i < a; ++i)
    {
        s[i] = tolower(s[i]);
    }
    return s;
}

// ***************************************************************************************

int main()
{
    NetworkListener_THREAD.Launch();
    string s;
    while (getline(cin, s) && ToLower(s) != "/stop")
    {
    }

    NetworkListener_THREAD.Terminate();

    return 0;
}

// ***************************************************************************************
 
Voici le code client:
// ***************************************************************************************

#include <iostream>

// ***************************************************************************************

#include <sfml/network.hpp>

// ***************************************************************************************

using namespace std;
using namespace sf;

// ***************************************************************************************

unsigned short port = 14532;

// ***************************************************************************************

void NetworkListener(void *Data)
{
    SocketUDP Receiver;
    Packet m;
    IPAddress Add;
    unsigned short p = port;

    Receiver.Bind(p);

    int i;

    while (true)
    {
        Receiver.Receive(m, Add, p);
        m >> i;

        if(i == 105)
        {
            cout << "Received from server" << endl;
        }
    }
    Receiver.Close();
}

Thread NetworkListener_THREAD(&NetworkListener);

// ***************************************************************************************

string ToLower(string s)
{
    unsigned int a = s.size();
    for (unsigned int i = 0; i < a; ++i)
    {
        s[i] = tolower(s[i]);
    }
    return s;
}

// ***************************************************************************************

int main()
{
    NetworkListener_THREAD.Launch();

    SocketUDP Sender;
    Packet packet;
    packet << 104;
    Sender.Send(packet, "192.168.0.102", port);
    Sender.Close();

    string s;
    while (getline(cin, s) && ToLower(s) != "/stop")
    {
    }

    NetworkListener_THREAD.Terminate();

    return 0;
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #1 le: Février 10, 2013, 10:41:33 am »
Tu ne peux pas binder deux sockets sur le même port sur la même machine (plus précisément, sur la même interface réseau). Il faut utiliser deux ports différents pour ton test en local.
Laurent Gomila - SFML developer

Ellpower

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #2 le: Février 10, 2013, 03:30:37 pm »
D'accord, j'ai effectué le changement de port dans le code de mon client mais j'ai toujours le même problème.

Code du client (Méthode NetworkListener):
void NetworkListener(void *Data)
{
    SocketUDP Receiver;
    Packet m;
    IPAddress Add;
    unsigned short p = 14533;

    Receiver.Bind(p);

    int i;

    while (true)
    {
        Receiver.Receive(m, Add, p);
        m >> i;

        if(i == 105)
        {
            cout << "Received from server" << endl;
        }
    }
    Receiver.Close();
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #3 le: Février 10, 2013, 03:31:51 pm »
Et côté serveur, tu as bien modifié le code pour que l'envoi se fasse sur ce nouveau port également ?
Laurent Gomila - SFML developer

Ellpower

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #4 le: Février 10, 2013, 03:38:16 pm »
Et bien le serveur reçoit le packet à l'adresse local mais sur un port random(ex: 192.168.0.102:63254) et donc le serveur envoie son message sur ce port(63254).

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #5 le: Février 10, 2013, 04:21:23 pm »
Si tu bindes ta socket client explicitement sur un port avant d'envoyer quoique ce soit, alors le port ne devrait pas être attribué aléatoirement. Il ne l'est que si tu n'as pas bindé toi-même la socket.

Tu devrais déjà essayer de faire les choses dans un seul thread. Là fais des choses sur ta socket client en même temps dans deux threads qui tournent en parallèle, c'est pas top.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Problème de communnication client/serveur
« Réponse #6 le: Février 11, 2013, 10:30:40 am »
En effet, tu devrait plutôt utiliser un seul thread et faire cela avec un seletor, et normalement c'est le même port pour le client et le serveur pour communiqué, c'est même obligé, sinon, ça ne marchera pas.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #7 le: Février 11, 2013, 10:56:42 am »
Citer
et normalement c'est le même port pour le client et le serveur pour communiqué, c'est même obligé, sinon, ça ne marchera pas
Non justement. Chaque socket doit avoir son propre port.
Laurent Gomila - SFML developer

Ellpower

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #8 le: Février 11, 2013, 06:20:06 pm »
Que voulez-vous dire par "utiliser un seul thread"?
Est-ce utiliser un thread pour le client et un selector pour le serveur?.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #9 le: Février 11, 2013, 08:19:27 pm »
Citer
Que voulez-vous dire par "utiliser un seul thread"?
Principe de base : quand ça ne marche pas, on simplifie le code pour se concentrer sur le problème. Donc ne met pas de thread tant que ton code n'est pas fonctionnel.

Si tu veux quand même garder tes threads, essaye au moins de ne pas utiliser ta socket depuis les deux threads en même temps. Genre ne lance le thread qu'après avoir fait le Send.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Problème de communnication client/serveur
« Réponse #10 le: Février 13, 2013, 09:14:49 am »
Citer
Non justement. Chaque socket doit avoir son propre port.
Ha bon..., donc si le client envoie des données sur le port 14533, le serveur les recevra sur le port 13569 ?
Moi j'utilise le même port pour les sockets du client et du serveur et ça marche pourtant mais je travaille avec le protocole TCP. (Sauf si tu passes par internet alors là il y a moyen avec la bos de rediriger les données sur un autre port mais toi tu travailles en local donc.)

Au pire si tu tiens à absolument garder tes thread, garde ton code et mets le en commentaire et fais une code plus simple avec un seul thread, après quand tu auras compris pourquoi ça ne marche pas, tu pourras repasser à un code plus complexe.
Toujours comme ça que moi je travaille.
Et pour info l'adresse local c'est 127.0.0.1 l'adresse local si tu exécute le client et le serveur sur la même machine, ou encore IpAddress::LocalHost.
« Modifié: Février 13, 2013, 09:24:51 am par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #11 le: Février 13, 2013, 09:24:44 am »
Citer
donc si le client envoie des données sur le port 14533, le serveur les recevra sur le port 13569 ?
Non.

Toi tu fais ça :

Client | 14533  -->  14533 | Serveur
       | 14533  <--  14533 |
 

On voit tout de suite le problème : si les deux sont exécutés sur la même machine (donc le contexte qui nous intéresse), alors ils utilisent tous deux le même port, ce qui est impossible (1 port par socket par interface réseau).

Donc moi je propose ceci :

Client | 14533  -->  14533 | Serveur
       | 13569  <--  13569 |
 

Ainsi, chaque socket est bindée sur un port différent en réception.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Problème de communnication client/serveur
« Réponse #12 le: Février 13, 2013, 09:35:39 am »
Bah moi je travaille avec le protocole TCP, ce n'est pas la même chose que lui, donc, le serveur écoute sur le port, le client envoie des données sur le port et le serveur lui répond toujours sur le même port et j'utiise comme adresse IP pour me connecter au serveur l'adresse LocalHost donc 127.0.0.1.

Lui il travaille avec le protocole UDP, donc, il faut en effet utiliser 2 ports différents si tu travailles sur la même machine, un pour la réception des données du serveur et l'autre pour la réception des données du client..., sinon ça ne va en effet pas marcher.
« Modifié: Février 13, 2013, 09:38:56 am par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de communnication client/serveur
« Réponse #13 le: Février 13, 2013, 10:38:53 am »
C'est strictement la même chose en TCP. Sauf que tu ne bindes pas explicitement tes sockets, donc tu ne voies pas que l'OS t'attribues en fait un port libre choisi aléatoirement pour la réception.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Problème de communnication client/serveur
« Réponse #14 le: Février 13, 2013, 04:45:39 pm »
Ha ok, merci, je comprends mieux là.