Le programme Serveur ne veut pas recevoir le paquet !

Bonjour à tous les clubiciens,

J’ai voulu m’entrainer un peu sur le module SFML.Network que je trouve pas mal du tout ( :smiley: ) pour faire une sorte d’un Mini-chat Client-Serveur et non P2P en console. Dès que je pourrai, je l’améliorerai et je le mettrai avec Qt prochainement.

Voilà mon code:

  • Le code du Client
#ifndef __cplusplus
#error "Ce code source est en C++ et non en C. Utilisez un Compilateur C++ s'il vous plaît"
#endif
 
#define ToStr(x) #x
 
#include <iostream>
#include <string>
 
#include <SFML/Network.hpp>
 
using std::cin;
using std::cout;
using std::endl;
using std::flush;
using std::cerr;
 
int main(int argc, char** argv)
{
    std::string Pseudo;
    std::string Message;
 
    sf::IPAddress Serveur = "localhost";
    sf::SocketTCP Client;
 
    cout << "Entrez votre pseudo: ";
    getline(cin, Pseudo);
    if(Pseudo.length() > 10) Pseudo.resize(10);
    system("cls");
 
 
    if(!Client.Connect(4500, Serveur)) {
        cout << "Impossible de se connecter au serveur." << endl;
        getchar();
        return 1;
    }
    std::string RecuPseudo;
    std::string RecuMessage;
 
    do
    {
        sf::Packet Packet;
        sf::Packet PacketRecu;
 
        cout << endl << endl;
        getline(cin, Message);
 
        if(Message == "/quit") break; // Si on a tapé QUE /quit, on arrête la boucle et on termine le programme.
 
        // Si le message dépasse les 5000 caractères
        // On le coupe (Du genre ce que fait MSN =P)
        if(Message.length() > 5000) Message.resize(5000);
 
 
        cout << "Preparation du packet... ";
        Packet.Clear();
        if(!(Packet << Pseudo << Message)) // cf. FAQ Developpez SL_cin_verify
        {
            cout << "Impossible de preparer le packet.";
            getchar();
            break;
        }
        cout << "Ok" << endl;
        cout << "Envoi du packet... ";
 
        if(Client.Send(Packet) != sf::Socket::Done)
        {
            cerr << "Impossible d'envoyer le paquet !" << endl;
            getchar();
            break;
        }
        cout << "Ok" << endl;
 
        cout << "Attente d'une reponse... ";
        PacketRecu.Clear();
        if(Client.Receive(PacketRecu) != sf::Socket::Done)
        {
            cerr << "Impossible de recevoir une reponse" << endl;
            getchar();
            break;
        }
        cout << "Ok" << endl;
 
 
        PacketRecu >> RecuPseudo >> RecuMessage;
 
 
        cout << '[' << RecuPseudo << "] " << RecuMessage << endl;
    } while(true);
 
    return 0;
}

  • Le code du Serveur

#include <iostream>
#include <sstream>
#include <string>
#include <SFML/Network.hpp>
 
using namespace std;
 
int main()
{
    std::string RecuPseudo;
    std::string RecuMessage;
    std::string Temp;
    std::vector<sf::SocketTCP> SocketsPrets;
 
 
    sf::SocketTCP Serveur;
    sf::SelectorTCP Selecteur;
 
    int Port = 4500;
 
    if (!Serveur.Listen(Port))
    {
        cerr << "Impossible d'ouvrir le port" << Port << "\n";
    }
    cout << "Ok ! Le serveur est pret:" << endl
    << "Port utilise: " << Port << endl;
 
    Selecteur.Add(Serveur);
 
    while (true)
    {
        Selecteur.GetSocketsReady(SocketsPrets); // On récupère les sockets prêts
 
        for (std::vector<sf::SocketTCP>::iterator i = SocketsPrets.begin(); i != SocketsPrets.end(); ++i)
        {
            sf::SocketTCP Socket = *i;
 
            if (Socket == Serveur) // Si le socket s'est connecté
            {
                sf::IPAddress AdresseClient;
                sf::SocketTCP Client;
 
                Serveur.Accept(Client, &AdresseClient);
                cout << "Un client s'est connecte: " << AdresseClient << endl;
                Selecteur.Add(Client); // On l'ajoute au selecteur
 
            }
            else
            {
                sf::Packet Packet;
                if (Serveur.Receive( Packet ) == sf::Socket::Done)
                {
                    Packet >> RecuPseudo >> RecuMessage; // On récupère le pseudo et le message
 
                   cout << '[' << RecuPseudo << ']' << endl
                        << " a dit: " << endl << "\t\t" << RecuMessage << endl;
 
                    Packet << RecuPseudo << RecuMessage;
                    if(Serveur.Send(Packet) != sf::Socket::Done)
                    {
                        cerr << "Impossible d'envoyer le paquet !" << endl;
                    }
                }
            }
        }
    }
    return 0;
}

Mon problème c’est que le client peut envoyer un packet mais le serveur ne peut pas recevoir ce paquet envoyé !
Pourtant si j’ai bien lu le code donné dans le tutoriel de la SFML, on peut recevoir un paquet sans avoir à en envoyer un avant.

Merci de votre réponse,
Si vous voulez plus d’explications, n’hésitez pas à me le demander :slight_smile:
@+

Midoagent47
Edité le 13/04/2008 à 13:02

Demande un accusé de réception?

(désolé)

Tu fais tes tests en local uniquement? ie: de localhost:XX vers localhost:YY ? Ton programme affiche bien “Machin s’est connecté” ?

Et y a quand même un truc qui me bloque - ayant fait des sockets uniquement avec les API C (dont bas niveau) : ton serveur, quand il est en accept() il n’est pas en mode bloquant? Donc il ne risque pas de recevoir les paquets parce qu’étant mono threadé, il ne peut pas lire & écrire.

Je ne sais pas si c’est ça, vu que tu utilises une API que je ne connais pas, donc bon…

Oui j’utilise des tests en local. Mon programme affiche Un client s’est connecté: 127.0.0.1.

Up !

Up !

Oula… calmos… Ton sujet est encore bien assez visible (il n’a pas descendu de beaucoup en 90minutes…)

Ah je pige mieux. Idem. Au prochain Up sauvage alors que le topic est toujours là, je ferme.