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

Réseau C Discussion :

Probleme recv() bloquant


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut Probleme recv() bloquant
    Bonjour,
    Je dois developper une DLL qui va s'occuper de gerer une communication avec un serveur.

    Mon probleme est que cette dll doit etre parcourue (enfait j'inclus cette dll dans un vi labView qui tourne en boucle).

    Mais comme la fonction recv() est bloquante, ca peut etre planter mon programme a partir du moment ou cette fonction ne recoit rien et ca ne peut pas se passer ...

    J'ai vu qu'il existait plusieurs moyen de regler le probleme ... Soit utiliser des thread, soit utiliser la fonction select ou alors rendre le socket non bloquant ...
    J'aurai besoin de votre avis (et voir d'une explication par la suite) pour savoir qu'elle solution semble la meilleur et par après comment la mettre en place ...

    Merci d'avance pour votre aide

    (ps: si besoin est, je peux vous poster le code déjà écrit)

  2. #2
    Membre confirmé
    Profil pro
    Responsable de projet
    Inscrit en
    Décembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de projet

    Informations forums :
    Inscription : Décembre 2005
    Messages : 97
    Par défaut
    Ben ouai essaye avec les thread ça a l'air pas mal comme solution ça.

  3. #3
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Pour rendre le file descriptor non bloquant :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    old_flags = fcntl(fd, F_GETFL, 0);
    if (!(old_flags & O_NONBLOCK)) {
         old_flags |= O_NONBLOCK;
    }
    fcntl(fd, F_SETFL, old_flags);

    Après la solution que je préfère est poll() (select un peu plus poussé mais moins portable)

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par |PaRa-BoL Voir le message
    Pour rendre le file descriptor non bloquant :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    old_flags = fcntl(fd, F_GETFL, 0);
    if (!(old_flags & O_NONBLOCK)) {
         old_flags |= O_NONBLOCK;
    }
    fcntl(fd, F_SETFL, old_flags);
    Pas portable.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    Et est ce que le code que j'ai posté est portable ?

  6. #6
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     erreur = WSAStartup(MAKEWORD(2,2), &initialisation_win32);
    Non...

  7. #7
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    Voila le probleme qui me vient a l'esprit ...
    c'est le principe du client / serveur !

    Dans mon cas, le client envoie une demande au serveur, le serveur lui répond (classique) ...

    Dans le cas ou le client enverait une demande et que le serveur ne répond pas, cela veut dire qu'il y a un probleme au niveau serveur ou tout simplement le cable réseaux.

    Et donc avec les thread ... La fonction recv() serait excecutée en parallèle et donc la fonction send() pourrait continuer a envoyer des messages ... Hors ca ne sert a rien puisque l'on a pas recu la réponse en retour ...

    Comment puis je agencer mon programme pour palier a ce probleme ?

  8. #8
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    |PaRa-BoL :
    Après mur reflexion, je pense que rendre le socket non bloquant pour ne pas qu'il boucle a sur la fonction recv() s'il ne recoit pas de message, n'est pas une solution sécurisée ... Parce que l'on est obligé de recevoir une réponse après avoir fait un send ... C'est juste que si le serveur plante il ne faut pas que ca boucle a l'infini sur recv() ...

  9. #9
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Heu... d'où l'intérêt de select() ou poll(). La documentation à ce sujet est largement répandu ...

    Cela permet justement d'éviter d'utiliser des thread.

    Parce que l'on est obligé de recevoir une réponse après avoir fait un send
    A bon ?

  10. #10
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Par défaut
    Xcusez moi ... Mais c'est ma premiere expérience dans le developpement d'une DLL pour une communication avec un serveur.

    Donc j'ai un peu de mal ...

    Dans un cas ou j'envoie plusieurs données différentes et que je peux en recevoir différentes aussi ...

    Les thread ne serait pas un moyen de simplifier le code ?

    Parce qu'avec le select, je devrais l'appeler a chaque fois que j'appelle ma fonction recv() ?
    Citation:
    Parce que l'on est obligé de recevoir une réponse après avoir fait un send

    A bon ?
    Dans mon cas ui ....

  11. #11
    Membre éclairé Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Par défaut
    Dans le cas de son logiciel sûrement. Au mieux tu prends la solution de |Para-bol sinon, tu peux aussi faire un petit timer pour ne pas faire une boucle trop longtemps ou utiliser les threads.

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

Discussions similaires

  1. Probleme recevfrom bloquante
    Par LinuxUser dans le forum Réseau
    Réponses: 2
    Dernier message: 09/12/2008, 12h45
  2. probleme recv() et send() client/serveur
    Par romainromain dans le forum Réseau
    Réponses: 2
    Dernier message: 18/12/2006, 19h13
  3. Probleme recv() [Winsock]
    Par kernox dans le forum Réseau
    Réponses: 3
    Dernier message: 11/04/2006, 20h58
  4. Probleme lors du recv TCP
    Par MonsieurAk dans le forum Développement
    Réponses: 3
    Dernier message: 10/01/2006, 15h56
  5. Réponses: 2
    Dernier message: 31/05/2005, 09h50

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