Forum de la communauté SFML

Aide => Réseau => Discussion démarrée par: Slash94 le Septembre 21, 2017, 07:20:50 pm

Titre: Détecter la déconnexion d'un client.
Posté par: Slash94 le Septembre 21, 2017, 07:20:50 pm
Salut à tous !

Alors voilà, depuis un bon moment déjà, j'utilise une technique qui fonctionne mais qui n'est pas fiable :

Lorsque le client se déconnecte, il envoi un packet pour en avertir le serveur et celui-ci agit en conséquence, néanmoins... si le client se déconnecte " salement " ( genre il ferme le programme via le processus ou le quitte en fermant la console d'un coup ou encore si sa connexion internet a soudainement un problème ), évidemment, la détection ne se fait pas.

Il y a plusieurs mois de cela, j'avais testé une méthode qui fonctionnait à merveille avec sf::Socket::Status mais impossible de retrouver le lien du topic et depuis une petite heure, j'essaye de retrouver la méthode, en vain.

J'ai essayé comme ceci, mais si je ferme le client d'un coup, le serveur ne détecte rien, hors, je sais que c'est parfaitement possible pour l'avoir expérimenté quelques mois auparavant grâce à la méthode énoncée dans ce fameux topic introuvable..

void Network::receiveData()
{
    ///SI UN CLIENT SE DECONNECTE///
    if (m_vecTempSocket.size()>0)
    {
        for (unsigned int i = 0 ; i < m_vecTempSocket.size() ; i++)
        {
            sf::Packet exitPacket;
            if (m_vecTempSocket[i]->receive(exitPacket) == sf::Socket::Status::Disconnected)
            {
                std::cout << "Le client est parti." << std::endl;
                m_vecTempSocket.erase(m_vecTempSocket.begin()+i);
            }
        }
    }
}
 

Je vous pose donc la question, ayant perdu de vue cette méthode qui était par ailleurs très simple.. c'est très frustrant !

Merci à vous ;-)
Titre: Re: Détecter la déconnexion d'un client.
Posté par: Laurent le Septembre 21, 2017, 07:34:38 pm
Une socket fermée va renvoyer Error ou Disconnected sur un send ou un receive, donc en théorie ça devrait fonctionner. Maintenant, ça dépend de beaucoup de choses autres que ce bout de code, donc difficile de dire ce qui ne va pas.
Titre: Re: Détecter la déconnexion d'un client.
Posté par: Slash94 le Septembre 21, 2017, 07:43:01 pm
Ben c'est un petit programme de test que j'ai fait juste pour tester cette fonction justement... et en effet, c'est sensé fonctionner, d'où mon étonnement.. je n'arrive plus à reproduire cette mini fonction qui fonctionnait parfaitement lorsque je l'avais testé...
De quoi aurais-tu besoin davantage afin de me venir en aide Laurent ? :-)
Titre: Re: Détecter la déconnexion d'un client.
Posté par: Slash94 le Septembre 21, 2017, 08:37:13 pm
Je suis un imbécile.

J'avais oublié une condition pour un delete...

Autrement-dit :

void Network::pushNewUser()
{
    sf::TcpSocket* socket = new sf::TcpSocket();
    socket->setBlocking(false);

    if (m_listener.accept(*socket) == sf::Socket::Done)
    {
        std::cout << "Connexion detectee : " << socket->getRemoteAddress() << std::endl;
        m_vecTempSocket.push_back(socket);
        sendServerState();
    } else {
        delete socket;
    }
}

Je n'avais pas mis le "else", donc forcément, j'effaçais le socket juste après.. Lol.
Les erreurs les plus stupides sont souvent les plus.... difficiles à déceler x)

Merci à toi Laurent ;-)