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

Auteur Sujet: [Résolu] [SFML2.0] Souci TcpListener.accept avec SocketSelector  (Lu 2633 fois)

0 Membres et 1 Invité sur ce sujet

Dragonic

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
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).
« Modifié: Août 24, 2013, 10:35:20 pm par Dragonic »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML2.0] Souci TcpListener.accept avec SocketSelector
« Réponse #1 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.
Laurent Gomila - SFML developer

Dragonic

  • Newbie
  • *
  • Messages: 46
    • Voir le profil
Re : Re : [SFML2.0] Souci TcpListener.accept avec SocketSelector
« Réponse #2 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 ^^ !
« Modifié: Août 24, 2013, 10:34:52 pm par Dragonic »