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

Auteur Sujet: Recevoir plusieurs paquets via receive() ?  (Lu 3736 fois)

0 Membres et 1 Invité sur ce sujet

Zylann

  • Newbie
  • *
  • Messages: 15
    • Voir le profil
Recevoir plusieurs paquets via receive() ?
« le: Mai 13, 2013, 07:48:25 pm »
Bonjour,
pour clarifier, je voudrais savoir si un socket en mode non-bloquant peut recevoir plus d'un paquet?
Je m'explique : quand on appelle receive(), on reçoit un paquet, mais est-ce possible que plusieurs soient en attente? Les récupère-t-on en appelant receive jusqu'à ce qu'il n'y en aie plus?
Ou faut-il passer en non-bloquant?
Et même question pour les envois, peut on envoyer plusieurs paquets à la fois en non-bloquant?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #1 le: Mai 13, 2013, 10:50:16 pm »
Ca fait quelle différence pour toi ? Que le truc vienne d'arriver, ou bien qu'il ait d'abord passé un moment en file d'attente, toi tout ce que tu as c'est un paquet reçu à un instant T. Tu n'as même pas à te poser ce genre de question, c'est le boulot des couches réseau de plus bas niveau de gérer ou non une file d'attente.

Mais sinon oui, il y a une file d'attente.
Laurent Gomila - SFML developer

Zylann

  • Newbie
  • *
  • Messages: 15
    • Voir le profil
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #2 le: Mai 13, 2013, 11:41:57 pm »
En fait je me pose ces questions car j'utilise le mode non-bloquant dans une boucle principale, et je me demande si il vaut mieux faire :
if(socket.receive(packet) == sf::Socket::Done)ou bien :
while(socket.receive(packet) == sf::Socket::Done)
« Modifié: Mai 13, 2013, 11:45:32 pm par Zylann »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #3 le: Mai 14, 2013, 07:54:27 am »
Ce te coûte quoi de mettre un while ?
Laurent Gomila - SFML developer

Odhexan

  • Newbie
  • *
  • Messages: 16
    • Voir le profil
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #4 le: Mai 14, 2013, 06:50:47 pm »
C'est vrai que le while ne coûte pas grand chose de plus. Et pour ton information, et comme l'a dit Laurent il y a en effet une fille d'attente. C'est d'ailleurs en partie pour ça qu'il y a des problèmes de pertes de paquets en UDP : lorsque la file est trop grande, le protocole "autorise" (si je puis dire ainsi, c'est surtout qu'il n'y a pas de vérifications) d'ignorer certains paquets (ce que le TCP évite). Mais comme dit précédemment c'est transparent, tu ne dois pas t'en soucier ;)

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #5 le: Juin 02, 2013, 02:29:05 pm »
Moi je fais comme ça, je fais un thread avec ça dans la fonction du thread :

while(running) {
   Packet packet;
    if (socket.receive(packet) == Socket::Done) {
        //Traitement.
    }
}

J'ai dû passé les sockets en mode non bloquant car dans la même boucle je reçois des données à la fois de socket TCP et de socket UDP donc si il attend de recevoir un message TCP avant de rendre la main et qu'il reçois un message UDP pendant ce temps, ça va poser problème, mais sinon pas obligé de travailler en mode non bloquant côté client, mais côté serveur si tu gère plusieurs connexion tcp alors là il faut travailler en mode non bloquant sinon c'est la galère.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #6 le: Juin 02, 2013, 07:25:31 pm »
N'oublie pas un petit sf::sleep quand tu fais une telle boucle avec des sockets non-bloquantes.

Note que tu peux gérer plein de sockets bloquantes dans le même thread, avec un sélecteur.
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #7 le: Juin 03, 2013, 11:02:27 am »
Ok.  :)

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #8 le: Juin 05, 2013, 02:08:03 pm »
Pourquoi il faut faire un sleep dans une boucle avec des sockets non-bloquants ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Recevoir plusieurs paquets via receive() ?
« Réponse #9 le: Juin 05, 2013, 02:26:37 pm »
Sinon ça va bouffer 100% du CPU pour rien.
Laurent Gomila - SFML developer