Bonjour la communauté,
Avant de vous fournir mon code, je met le contexte :
Le serveur doit attendre la connexion d'un nombre précis de clients (2 à 7).
=> pour se faire j'utilise un "listener", chaque nouvelle socket est indexée dans un vector, et ajoutée à un selector.
Note je n'ajoute pas le listener au selector puisque le nombre de client atteint, aucune autre connexion ne doit s'ajouter.
Lorsque le nombre est atteint, les échanges serveurs / client peuvent commencer.
=> sur le serveur, utilisation de selector "wait" et boucle "for" sur le vector pour déterminer la socket concernée, puis réception du packet
=> sur le client, socket send packet dès que la connexion est établie.
je lance le serveur en débug et le client en release. impossible de voir le selector quitter le "wait" et lancer la lecture du vector (comme si le packet n'était pas envoyé par le client...) Je sèche
ci dessous le code serveur minimal (pour le test je n'attend qu'un seul client):
#include <iostream>
#include <vector>
#include <SFML/Network.hpp>
using namespace std;
int main()
{
unsigned int nbJoueurs(1); // un seul client pour le test
// vector pour stocker les socckets des joueurs
std::vector <sf::TcpSocket*> V_client;
// declaration du socket (allo) de l'écouteur
sf::TcpListener allo;
//Declaration d'un selecteur de socket
sf::SocketSelector selecteur;
// affectation au port (breton 56 ^^) à écouter
unsigned short int port=56000;
if (allo.listen(port) != sf::Socket::Done)
{
// erreur...
std::cout << "port inécoutable" << std::endl;
return -1;
}
else std::cout << "Allo ? J'ecoute le port 56000" << std::endl; // serveur lancé
bool tousPresents(false); // passe à true si tous les joueurs ont un socket attitré
// boucle de surveillance et connexion des joueurs attendus
while(!tousPresents)
{
// déclaration d'un socket à affecter au prochain client qui le demande
sf::TcpSocket joueur;
if (allo.accept(joueur) == sf::Socket::Done)
{
V_client.push_back(&joueur);
selecteur.add(joueur);
}
if (V_client.size() == nbJoueurs) tousPresents=true;
}
std::cout << "nos " << nbJoueurs << " joueurs sont connectés sur le serveur." << std::endl;
std::cout << "V_client size = " << V_client.size() << std::endl;
//boucle d'échange de données
sf::Packet paquet;
sf::Int32 x(0);
bool flag(false);
while(!flag)
{
//boucle d'attente de message
if (selecteur.wait()) // <= c'est là que ça semble foirer...
{
for(unsigned int i(0); i<V_client.size(); i++)
{
if (selecteur.isReady(*V_client[i]))
{
V_client[i]->receive(paquet);
paquet >> x;
std::cout << "paquet reçu ; x vaut : " << x << endl;
if (x==-1) flag=true;
x=-10;
paquet << x;
system("pause");
V_client[i]->send(paquet);
}
}
}
}
return 0;
}
et le code client :
#include <iostream>
#include <SFML/Network.hpp>
using namespace std; // DSL...
int main()
{
sf::Int32 x = 10;
unsigned short int port(56000);
bool flag(false);
sf::TcpSocket socket;
sf::Socket::Status statut = socket.connect("192.168.1.14", port); // Ipv4 locale du serveur
if (statut != sf::Socket::Done)
{
return -1;
}
else
{
std::cout << "connexion établie sur port " << port << std::endl;
sf::Packet paquet;
paquet << x;
if (socket.send(paquet)!= sf::Socket::Done)
{
std::cout << "erreur d'envoi de paquet" << std::endl;
system("pause");
}
while (!flag)
{
// pour patienter
}
return 0;
}
Je devrais recevoir le packet et en extraire x qui vaudrait 10, mais non...
Une piste ?
Rick.