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

Auteur Sujet: [sf::SocketSelector] Problèmes d'utilisations.  (Lu 2176 fois)

0 Membres et 1 Invité sur ce sujet

Rodd

  • Newbie
  • *
  • Messages: 43
    • Voir le profil
    • E-mail
[sf::SocketSelector] Problèmes d'utilisations.
« le: Décembre 10, 2012, 01:58:27 am »
Bonjour à tous,

j'ai quelques soucis sur le fonctionnent d'un SocketSelector.. :( Je m'explique...
En réalité j'ai du mal à comprendre l'utilité réel d'un selector. Si j'ai bien compris, avant il serait à mettre le socket sur le devant de la liste lorsqu'il y a réception d'un packet. non ? Et que maintenant il ne sert qu'à signaler qu'il y a un socket qui a recu un packet non ?

En gros, actuellement j'ai mon programme qui fonctionne de cette manière :


//CECI N'EST QU'UNE PARTIE DE MON CODE
void newConnected()
{
    sf::TcpSocket* client = new(sf::TcpSocket);
    if(serverTcp.accept(*client) == sf::Socket::Done){
        std::cout<<"New connection received from "<<client->getRemoteAddress()<<std::endl;
        clients.push_back(client);
        selectorTcp.add(*client);}
    else{
        delete client;}
}

void online()
{
    newConnected();

    if(selectorTcp.wait(sf::microseconds(1))){
        for(int x=clients.size()-1; x>=0; --x){
            sf::TcpSocket* client = clients.at(x);
            if(selectorTcp.isReady(*client)){
                sf::Packet packet;
                sf::Socket::Status status= client->receive(packet);
                if(status == sf::Socket::Done){
                    analysis(packet);}
                else{
                    std::cout<<"Probleme de reception"<<std::endl;}}}}
}
 

Mais l'inconvénient de ce code, c'est qu'il parcourt tout les sockets actuellement connecté pour vérifier lequel est prêt. Non ?

Voilà, j'ai besoin de quelques éclaircissements pour comprendre mieux le fonctionnement de cette fonction ou si il ya clairement moyen de mieux faire que cette méthode s'il vous plait :(

Le but étant de pouvoir tenir un transfert rapide entre les clients et le serveur pour au moins 10 personnes.

Merci beaucoup!

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [sf::SocketSelector] Problèmes d'utilisations.
« Réponse #1 le: Décembre 10, 2012, 08:16:08 am »
Il n'y a pas de "liste", ni de "devant". Le sélecteur va juste détecter lorsque l'une des sockets a reçu quelque chose, et te le signaler. Ensuite, la manière de récupérer la socket qui est prête (itérer sur toutes les sockets ou bien la récupérer directement), c'est un détail de conception, techniquement ça ne change rien.

Mais si ton délai d'attente est le minimum (1 microseconde), pourquoi ne pas directement passer les sockets en non-bloquantes ? Là tu vas dans tous les cas boucler à fond, or l'intérêt du sélecteur est que ton thread de réception puisse rester inactif si rien n'est reçu sur aucune socket.
Laurent Gomila - SFML developer

Rodd

  • Newbie
  • *
  • Messages: 43
    • Voir le profil
    • E-mail
Re : [sf::SocketSelector] Problèmes d'utilisations.
« Réponse #2 le: Décembre 10, 2012, 11:56:01 am »
J'aimerais mettre cette boucle en bloquant dans un thread effectivement. Mais je n'ai jamais manipulé de thread auparavant et j'ai du mal à bien l'intégrer dans un code.

Dans ce cas-ci, si je fais un thread en bloquant pour cette boucle, ca bloquerait la fonction dans laquelle elle se trouve vu que j'aurai mis un thread.wait( ) et avec mon utilisation de "  .pollEvent(event) display() " en simultané, ca bloquerait le programme à l'utilisateur non ?

-> À moins que je fasse en sorte que cette boucle soit indépendante à la boucle d'action de l'utilisateur .. hm. Je vais tenter de modifier quelques trucs, ca peut être bien. Dites moi si je me trompe !

Merci pour les explications :)

 

anything