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

Auteur Sujet: Probleme communication entre serveur et client  (Lu 2549 fois)

0 Membres et 1 Invité sur ce sujet

CptGervais

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Probleme communication entre serveur et client
« le: Novembre 10, 2012, 04:10:26 pm »
Alors pour commencer, je débute complétement en réseau. Histoire d'apprendre à manipuler les sockets, j'ai tenter de coder une structure Serveur/Client. Je voudrais que le serveur commence par envoyer un message, le client le reçoit, l'affiche, et envoi ensuite au serveur un autre message que le serveur affichera lui aussi par la suite. Voici le code du serveur :

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

using namespace sf;
using namespace std;

int main()
{
    IPAddress Address1 = IPAddress::GetLocalAddress();
    char buffer[128];
    IPAddress Sender;
    size_t received;
    unsigned short Port = 4567;
    SocketUDP socket2;
    cout << "Socket creee" << endl;

    if(!socket2.Bind(Port))
        cout << "Erreur lors de la liaison avec le port " << Port << endl;
    else
        cout << "Socket liee " << endl;

        if(socket2.Receive(buffer, sizeof(buffer), received, Sender, Port) != Socket::Done)
            cout << "Le message n'a pas pu etre reçu" << endl;
        else
            cout << "Le message a ete recu" << endl;
            cout << "Envoyeur : "<< Sender << " Port : " << Port;

        cin >> buffer;
        if(socket2.Send(buffer, sizeof(buffer), Address1, Port) != Socket::Done)
            cout << "Le message n'as pas pu etre envoyer." << endl;
        else
            cout << "Paquet envoye..." << endl;

        socket2.Close();
        cin >> Sender;

    return 0;
}

Et celui du client :

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

using namespace sf;
using namespace std;

int main()
{
    IPAddress Address1 = IPAddress::GetLocalAddress();
    IPAddress Sender;
    size_t received;
    string AdresseIP;
    AdresseIP = Address1.ToString();
    unsigned short Port = 4567;
    SocketUDP socket1;
    char buffer[128];

    if(socket1.Send(buffer, sizeof(buffer), Address1, Port) != Socket::Done)
        cout << "Le message n'as pas pu etre envoyer." << endl;
    else
        cout << "Message envoye..." << endl;

    socket1.Close();

    SocketUDP socket2;
    if(!socket2.Bind(Port))
        cout << "Erreur lors de la liaison avec le port " << endl;
    else
        cout << "Socket liee " << endl;

    if(socket2.Receive(buffer, sizeof(buffer), received, Sender, Port) != Socket::Done)
        cout << "Le message n'a pas pu etre recu" << endl;
    else
        cout << "Envoyeur : "<< Sender << "paquet : " << buffer << endl ;

    socket2.Close();
    cout << AdresseIP;
    cin >> AdresseIP;
    return 0;
}

Tout marche bien jusqu'à que le serveur envoie le 2nd paquet, mais le client ne l'affiche pas. Pourquoi ?
« Modifié: Novembre 10, 2012, 04:12:51 pm par CptGervais »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme communication entre serveur et client
« Réponse #1 le: Novembre 10, 2012, 04:31:50 pm »
Pourquoi est-ce que tu utilises deux sockets côté client ? Essaye avec une seule.

Quand tu dis "le client ne l'affiche pas", concrètement il  se passe quoi au niveau du programme ? Il ne reçoit rien ? Il reçoit une erreur ? ...

As-tu essayé l'exemple "Sockets" du SDK SFML ?
Laurent Gomila - SFML developer

CptGervais

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Re : Probleme communication entre serveur et client
« Réponse #2 le: Novembre 10, 2012, 04:55:09 pm »
J'ai fait tous les exemples donnés sur les sockets.
Ensuite, si je ferme pas la socket pour en ouvrir une autre, l’exécutable m'indique une erreur lors de la liaison entre la socket1 avec le port 4567.
Et coté client il se passe rien, je suppose qu'il ne reçoit pas le message.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme communication entre serveur et client
« Réponse #3 le: Novembre 10, 2012, 05:19:08 pm »
Ah ben oui, faut pas utiliser le même port de réception pour les deux sockets si t'es sur le même PC. Un port ne peut être utilisé que par une socket à la fois.
Laurent Gomila - SFML developer

CptGervais

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Re : Probleme communication entre serveur et client
« Réponse #4 le: Novembre 11, 2012, 10:49:18 pm »
Dans l'ordre, j'envoie avec le client sur le port 4567, je le lis au port 4568 et là il m'affiche toujours la même erreur lors de la liaison.
Le résultat coté serveur ne change pas, je le lis au port 4569, et envoie sur le port 4570.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme communication entre serveur et client
« Réponse #5 le: Novembre 11, 2012, 11:02:03 pm »
Il faut bien entendu envoyer sur le port sur lequel l'autre socket écoute ;)

Donc en gros il te faut deux ports d'écoute : un pour le client, un pour le serveur. Le client envoie sur le port du serveur, et vice-versa. Tu n'as même pas besoin de spécifier le port d'écoute de celui qui commence par envoyer : l'OS lui en attribue un, et de l'autre côté tu le récupère avec le dernier paramètre de la fonction Receive.
Laurent Gomila - SFML developer

CptGervais

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
    • E-mail
Re : Probleme communication entre serveur et client
« Réponse #6 le: Novembre 12, 2012, 07:48:39 pm »
ça marche :D
Par contre j'aimerai pousser plus loin, et j'ai remarquer que si je rentrais une phrase avec des espaces dans le buffer du client, le serveur, lui, avec "cout << buffer;" affiche jusqu'au prochain espace et passe à la commande suivante, du coup ma question devient logiquement la suivante : Comment afficher la phrase entière ?
Vous l'aurez deviner, j'essaye de coder un tchat...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Probleme communication entre serveur et client
« Réponse #7 le: Novembre 12, 2012, 08:43:09 pm »
cin >> buffer s'arrête aux espaces. Il faut utiliser getline(cin, buffer) pour lire une ligne entière.
Laurent Gomila - SFML developer