Bonjour à tous les clubiciens,
J’ai voulu m’entrainer un peu sur le module SFML.Network que je trouve pas mal du tout ( ) 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
@+
Midoagent47
Edité le 13/04/2008 à 13:02