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] timeout recv


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 226
    Points
    226
    Par défaut [Socket] timeout recv
    Bonjour,

    Voila j'aimerais mettre un timeout à mon recv mais j'ai un petit problème.

    En cherchant sur internet j'ai trouvé que je devait insérer ceci dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct timeval tv;
    tv.tv_sec = 1;
    tv.tv_usec = 500*1000;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval));
    Et moi je fait comme ceci pour récupérer les paquets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(nbr = recv(sock, ptr_buf, taille, 0))
    {
        //...recalcule taille et incrément ptr_buf de nbr
    }
    Le problème c'est que toutes les 1,5 secondes, il fait un tour de boucle et moi je voudrait que la boucle s'arrête au premier timeout !

    Merci d'avance...

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Donc si je comprend bien, tant que tu reçoit des paquets, apres chaque reception, tu fait un tour de boucle. Et si jamais tu arrives à la fin du timeout sans avoir reçus de packet, tu souhaite sortir du while.

    Et bien faut que au debut du while tu test si tu as reçus un message.
    Pour un recv non bloquant comme le tiens, nbr = -1 et errno = EAGAIN si aucun message n'est arrivé à la fin du timeout

    Sinon, personnelement, pour utiliser un timeout avec recv ou recvfrom, j'utilise la fonction poll.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int poll(struct pollfd *ufds, unsigned int nfds, int délai);
    Cette fonction te permet de surveiller un descripeur de fichier. A la fin du timeout, que tu aura choisis, tu peux recuperer l'état de ton descripteur de fichier. Et entre autre, tu peux savoir si tu a reçus des données. Et si c'est le cas, tu fait un appel à receive. Et c'est ok.

    En esperant que cela t'aide, bonne continuation.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 396
    Points : 226
    Points
    226
    Par défaut
    Oui ça m'aide , merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Socket] - Problème recv avec UTF8
    Par JuS80 dans le forum Réseau
    Réponses: 4
    Dernier message: 17/04/2007, 10h46
  2. Socket : fonction recv.
    Par thieum74 dans le forum C++
    Réponses: 7
    Dernier message: 06/04/2006, 11h18
  3. [Socket] Send/Recv type double sur architectures différentes
    Par nicolas.pied dans le forum Réseau
    Réponses: 4
    Dernier message: 31/03/2006, 21h33
  4. Réponses: 2
    Dernier message: 31/05/2005, 10h50
  5. [Sockets] Timeout sur accept() ?
    Par MikB dans le forum Développement
    Réponses: 2
    Dernier message: 30/12/2003, 18h22

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