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

Auteur Sujet: [SFML network]sf::SelectorTCP wait bloquant malgrès un socket pret  (Lu 4004 fois)

0 Membres et 1 Invité sur ce sujet

gregleboss50

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
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.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML network]sf::SelectorTCP wait bloquant malgrès un socket pret
« Réponse #1 le: Juin 27, 2012, 12:52:30 pm »
"Ready" pour le sélecteur signifie "prêt à recevoir". Donc si ton client ne fait qu'attendre, la socket correspondante côté serveur ne sera jamais prête.

Tu n'as pas besoin de sélecteur dans ton cas, une socket est toujours prête à envoyer. C'est pour la réception que c'est utile.
Laurent Gomila - SFML developer

gregleboss50

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : [SFML network]sf::SelectorTCP wait bloquant malgrès un socket pret
« Réponse #2 le: Juin 27, 2012, 04:02:58 pm »
A ok d'accord...
Mais du coup comment faire une liste de de socket client?
std::vector mais on ne peux pas supprimer qu'une entrée.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML network]sf::SelectorTCP wait bloquant malgrès un socket pret
« Réponse #3 le: Juin 27, 2012, 04:17:11 pm »
Il y a tout ce qu'il faut dans les tutoriels et la doc de sf::SelectorTCP, dans les divers exemples, et ici sur le forum, non ? Est-ce que tu as pris le temps de lire tout ça avant d'essayer de coder quelque chose ?

En plus tu devrais passer à SFML 2 tout de suite, ce code est voué à devenir obsolète très rapidement (il l'est déjà plus ou moins).
Laurent Gomila - SFML developer

gregleboss50

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : [SFML network]sf::SelectorTCP wait bloquant malgrès un socket pret
« Réponse #4 le: Juin 27, 2012, 04:20:29 pm »
Oui j'ai chercher (mais je chercher en croyant que GetSocketReady servais à se que je veaux faire).
Et pour SFML 2 sa sort quand (un ordre de grandeur au moins) ? Je sais que la "béta" et sorti mais je veux dire la sortie officiel.
Merci de la rapidité de ta réponse.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML network]sf::SelectorTCP wait bloquant malgrès un socket pret
« Réponse #5 le: Juin 27, 2012, 04:24:03 pm »
En fait SFML 2 est finalisée, il faut juste que je termine l'écriture des tutoriels avant de sortir la version finale (ça risque de prendre pas mal de temps, au moins un mois ou deux). Donc tu peux sans problème utiliser la release candidate en attendant.
Laurent Gomila - SFML developer

gregleboss50

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : [SFML network]sf::SelectorTCP wait bloquant malgrès un socket pret
« Réponse #6 le: Juin 27, 2012, 04:26:37 pm »
Ok merci  :).