Forum de la communauté SFML

Aide => Réseau => Discussion démarrée par: Dragonic le Août 24, 2013, 10:14:59 pm

Titre: [Résolu] [SFML2.0] Souci TcpListener.accept avec SocketSelector
Posté par: Dragonic le Août 24, 2013, 10:14:59 pm
Bonjour,

Je crée tranquillement le nécessaire pour un serveur gérant plusieurs clients. Mais j'ai un souci car le SocketSelector (dans lequel j'ai donc enregistré mon TcpListener), ne répond jamais lorsqu'un client fait un "connect". Le client reçoit bien la comfirmation de la connexion dit en passant !

voici le code concerné :

GLvoid Net_BasicServer::listenConnectTCP_Thread()
{
        sf::SocketSelector selector;
        selector.add(m_TCPlistener);

        m_b_stopThreads = false;

        // lie l'écouteur à un port
        if (m_TCPlistener.listen(m_portEcoute) != sf::Socket::Done)
        {
                std::cout<<"port déjà utilisé"<<std::endl;
        }

        std::cout<<"Début thread écoute TCP Serveur"<<std::endl;

        while(!m_b_stopThreads)
        {
                // socket TCP d'écoute:
                if (selector.wait(sf::milliseconds(60)))
                {
                        if (selector.isReady(m_TCPlistener))
                        {
                                std::cout<<"test nouveau client"<<std::endl;

                                sf::TcpSocket* socket=new sf::TcpSocket();

                                if (m_TCPlistener.accept(*socket) == sf::Socket::Done)
                                {
                                        std::cout<<"nouveau client connecté"<<std::endl;

                                        m_clients.push_back(new Net_ConnectedClient(socket));
                                }
                        }
                }
        }

        std::cout<<"Fin thread écoute TCP Serveur"<<std::endl;

        m_TCPlistener.close();
}

Et voici donc les résultats de mes tests :

- avec ce code, si un client se connecte, il reçoit la confirmation de la connexion. Mais coté serveur, il ne passe jamais dans "if (selector.isReady(m_TCPlistener))". Et impossible ensuite de retenter une autre connexion

- testé sans le "if (selector.isReady(m_TCPlistener))", et bien entendu ça ne change rien. Donc en fait c'est qu'il ne parvient jamais à rentrer dans "if (selector.wait(sf::milliseconds(60)))". le selector ne semble pas réagir au connect du client.

- en supprimant le selecteur, tout fonctionne, le TcpListener.accept est pris en compte, d'autres clients peuvent rejoindre.

Voilà, je reste à disposition si il y a besoin d'autres infos. Au pire je peux toujours trouver un moyen de ne pas utiliser de selector, mais je les trouve bien utile pour justement stopper mes threads de façon bien contrôlé (dans ce cas j'ai juste à passé m_b_stopThreads à false dans le thread principal, et ça va me stopper l'écoute après 60 msec max).
Titre: Re : [SFML2.0] Souci TcpListener.accept avec SocketSelector
Posté par: Laurent le Août 24, 2013, 10:27:09 pm
C'est assez vicelar (et tu ne pouvais pas deviner) : en fait la socket interne est créée non pas dans le constructeur de TcpListener, mais dans la fonction listen. Du coup tu ajoutes ton listener trop tôt au sélecteur, la socket interne n'existe pas encore.
Titre: Re : Re : [SFML2.0] Souci TcpListener.accept avec SocketSelector
Posté par: Dragonic le Août 24, 2013, 10:32:24 pm
C'est assez vicelar (et tu ne pouvais pas deviner) : en fait la socket interne est créée non pas dans le constructeur de TcpListener, mais dans la fonction listen. Du coup tu ajoutes ton listener trop tôt au sélecteur, la socket interne n'existe pas encore.

Haha, en effet j'aurais eu du mal à deviner ^^ ! Je m'en vais tester ça de suite ^^ !

EDIT : c'est parfait, ça fonctionne bien ^^ ! Merci d'avoir répondu si rapidement, ça va me permettre de continuer un peu à coder ce soir l'esprit tranquille ^^ !