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

Visual C++ Discussion :

[SOCKET] comment rendre send() bloquant


Sujet :

Visual C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut [SOCKET] comment rendre send() bloquant
    Salut,

    J'ai un programme qui communique avec un autre par l'intermédiaire de 2 sockets 1 socket non-bloquante et 1 socket bloquante. Le problème est que je n'arrive pas a rendre la 2ème socket non-bloquante, j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    u_long bloquant = 0;
    ioctlsocket(sock, FIONBIO, &bloquant);
    après ce code la fonction recv() est bien bloquante mais send() n'est pas bloquante elle retourne une valeur immédiatement.

    Merci d'avance de bien vouloir m'aider

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    send() est généralement rapide.
    Si l'erreur retournée par WSAGetLastError() n'est pas WSAEWOULDBLOCK, ce n'est pas un problème d'être bloquant ou non.

    Si tu cherches à attendre de manière bloquante que le destinataire ait bien reçu le message, j'ignore si c'est possible. Tu peux essayer en donnant une taille de buffer d'envoi nulle coté envoyeur et une taille de buffer de réception nulle coté récepteur (à supposer que Windows l'accepte)...

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    À mon avis, ce serait plus simple de faire simplement renvoyer un acquittement par le client...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 227
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par Médinoc
    send() est généralement rapide.
    J'ai essayé de faire un send() en mettant un recv() de l'autre coté avec un delai de 5sec. (c'est a dire que j'attend 5sec. avant de faire mon recv()).
    Donc logiquement comme je suis en mode bloquant, le send() ne devrait rester bloquant jusqu'a ce que le recv() ait reçu. Or là recv() n'a pas encore été appelé que send() renvoi deja quelque chose (en clair il est pas bloquant). Ensuite quant le recv() se déclenche 5sec. plus tard il reçoit bien les données du send().

    Par contre j'ai fait l'expérience dans l'autre sens : recv() en premier et send() 5sec. plus tard, et là le recv() reste bien bloquant : il attend de recevoir les donnees du send(), avant de retourner un valeur.

    J'espère ne pas avoir été trop confu dan smes explications, si vous pouvez m'aidez à résoudre cet étrange problème...


  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Comme je l'ai déjà dit, les données sont bufferisées. L'absence de recv() ne bloque pas un send() bloquant à moins que le buffer interne d'envoi soit plein...
    (et ce buffer se videra naturellement jusqu'à ce que le buffer interne de réception de l'autre coté soit lui-même plein).

    Bref, si tu veux voir un send() bloquant bloquer, fais-lui envoyer 5Mo, mais pas 3 octets qui se battent en duel...

Discussions similaires

  1. Comment rendre un événement bloquant en node.js
    Par Anonyme5571 dans le forum NodeJS
    Réponses: 0
    Dernier message: 29/01/2015, 17h24
  2. Comment rendre une instruction bloquante ?
    Par ArnaudFu13 dans le forum Interfaces Graphiques
    Réponses: 8
    Dernier message: 16/01/2013, 18h18
  3. Rendre fonction send bloquante
    Par sivaller dans le forum Windows
    Réponses: 5
    Dernier message: 10/09/2008, 12h49
  4. [Socket] Comment casser un read bloquant ?
    Par ramislebob dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 01/08/2007, 09h15
  5. Comment rendre transparent le tour d un icone
    Par NeoRonin dans le forum Composants VCL
    Réponses: 7
    Dernier message: 03/03/2003, 02h40

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