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 confirm�
    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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    � mon avis, ce serait plus simple de faire simplement renvoyer un acquittement par le client...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirm�
    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
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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, 16h24
  2. Comment rendre une instruction bloquante ?
    Par ArnaudFu13 dans le forum Interfaces Graphiques
    R�ponses: 8
    Dernier message: 16/01/2013, 17h18
  3. Rendre fonction send bloquante
    Par sivaller dans le forum Windows
    R�ponses: 5
    Dernier message: 10/09/2008, 11h49
  4. [Socket] Comment casser un read bloquant ?
    Par ramislebob dans le forum Entr�e/Sortie
    R�ponses: 6
    Dernier message: 01/08/2007, 08h15
  5. Comment rendre transparent le tour d un icone
    Par NeoRonin dans le forum Composants VCL
    R�ponses: 7
    Dernier message: 03/03/2003, 01h40

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