IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Socket, Select + Peek ?


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut Socket, Select + Peek ?
    Bonjour,

    Je cherche à pouvoir lire un message d'une socket, dans sa totalité. J'utilise un select sur le file descriptor et une socket non bloquante. Le select m'indique que des données ont été écrite. Cependant, il arrive de temps en temps que je ne puisse récupérer la totalité des octets, car ceux ci ne sont pas tous disponibles. Du coup, le recv ne retourne pas le nombre attendu.

    Donc, j'utilise un select, suivi d'un recv avec option PEEK, qui n'enlève pas les données de la socket. Dès que le recv option PEEK retourne le nombre d'octets attendu, j'utilise le recv sans l'option PEEK.

    Y'a t-il un autre moyen de réaliser ce type d'opération ? Il y a je crois le recv avec l'option MSG_WAITALL mais du coup il se peut que je reste bloqué tout le temps.

    Julien.

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Visiblement, tu utilises un socket de type STREAM (style TCP), alors que tu voudrais un socket de type DATAGRAM (à la UDP).

    Dans le premier cas, les octets arrivent les uns à la suite des autres, et tu les lis au fur et à mesure que tu appelles recv(), un peu comme si c'était un fichier et la fonction read().

    Dans le deuxième cas, les octets arrivent par "messages". Chaque message correspond à un envoi via send() ou sendto(), et l'autre partie le recupère via recv ou recvfrom comme un objet "atomique". Le récepteur ne reçoit rien tant que tout n'est pas arrivé.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Exact, j'utilise une socket TCP. Effectivement, je pourrais basculer vers du UDP mais je ne peux pas me permettre de "perdre" des paquets. Y'a t-il une autre solution en utilisant les sockets TCP ?

    Julien.

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    MSG_WAITALL va effectivement attendre que le nombre d'octets que tu attends arrive. Tu peux utiliser setsockopt() avec un SO_RCVTIMEO ou je ne sais plus trop comment s'appelle ce flag pour spécifier un timeout.

    J'admets que ce n'est pas exactement ce que tu cherches : l'idéal dans ton cas serait d'attendre qu'un certain nombre d'octets soit dispo sur ce socket avant de le lire, mais là perso je ne vois pas. J'avais trouvé une fonction qui permettait de savoir combien d'octets sont dispo à la lecture, mais je suis incapable d'y remettre la main dessus, et ce n'est pas l'idéal dans ton cas.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Ah je vais quand même tester le MSG_WAITALL avec le timeout.

    Merci Phi !

    Julien.

Discussions similaires

  1. Erreur HaProxy (cannot bind socket, select test FAILED)
    Par Laurent4242 dans le forum Administration système
    Réponses: 0
    Dernier message: 25/06/2014, 06h29
  2. Socket / Select / temps de reponse
    Par Necko dans le forum Réseau
    Réponses: 15
    Dernier message: 12/06/2011, 17h16
  3. Réponses: 0
    Dernier message: 24/02/2011, 19h08
  4. Pb de socket : select() et send()
    Par olive_le_malin dans le forum Réseau
    Réponses: 16
    Dernier message: 11/06/2006, 11h42
  5. socket & select
    Par keyra dans le forum Réseau
    Réponses: 7
    Dernier message: 29/01/2006, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo