Bonjour à tous,
j'essaye de réaliser une application en réseau avec la SFML, mais n'y connaissant rien en prog réseau, j'ai suivit les tuto sur le site officiel de la SFML.
Pour gérer tout les clients sur le serveur, j'utilise les SelectorTCP mais voila, la fonction wait du Selector bloque malgrès la présence d'un socket pret.
Voici mon code :
Serveur.cpp :
#include "Serveur.h"
Serveur::Serveur()
{
if (!serveur.Listen(26666))
return;
serveur.SetBlocking(false);
while (true)
{
sf::IPAddress Address;
sf::SocketTCP Client;
if(serveur.Accept(Client, &Address) == sf::Socket::Done)
{
std::cout << "nouveau client : " << Address << std::endl;
selector.Add(Client);
this->sendMessage("new clients");
}
}
}
void Serveur::sendMessage(std::string str)
{
sf::Packet packet;
packet << str;
std::cout << "ici" << std::endl;
unsigned int NbSockets = selector.Wait();
std::cout << NbSockets << std::endl;
for (unsigned int i = 0; i != NbSockets; ++i)
{
sf::SocketTCP Socket = selector.GetSocketReady(i);
if(!Socket.Send(packet))
{
selector.Remove(Socket);
}
}
}
Serveur::~Serveur()
{
unsigned int NbSockets = selector.Wait();
for (unsigned int i = 0; i < NbSockets; ++i)
{
sf::SocketTCP client = selector.GetSocketReady(i);
client.Close();
}
}
Serveur.h (rien d'important mais je le met quand même :
#ifndef SERVEUR_H
#define SERVEUR_H
#include <SFML/Network.hpp>
#include <iostream>
class Serveur
{
public:
Serveur();
void sendMessage(std::string str);
~Serveur();
private:
sf::SelectorTCP selector;
sf::SocketTCP serveur;
};
#endif // SERVEUR_H
Le main créé juste une instance de Serveur.
Du côté client maintenant :
main.cpp (le seul fichier) :
#include <SFML/Network.hpp>
#include <iostream>
int main()
{
bool continuer = true;
sf::SocketTCP client;
sf::Packet packet;
std::string str;
if (client.Connect(26666, "127.0.0.1") == sf::Socket::Done)
{
//client.SetBlocking(false);
while(continuer)
{
if(client.Receive(packet) == sf::Socket::Done)
{
packet >> str;
std::cout << str << std::endl;
}
}
}
else
{
std::cout << "Probleme de connexion avec le serveur" << std::endl;
}
client.Close();
system("pause");
return 0;
}
Lorsqu'un client se connecte cela affiche dans la console du serveur :
nouveau client : 127.0.0.1
ici
Mais cela n'affiche pas la valeur de NbSockets car la fonction wait bloque et donc le client ne reçois rien.
La console affiche 1 à la déconnexion du client.
Merci de votre aide et désolé pour les fautes d'orthographes.