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 :

Fonctionnement de send et recv


Sujet :

Réseau C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Fonctionnement de send et recv
    Bonjour,

    Je cherche des explications sur le comportement des fonction send et recv.

    Dans un modèle de communication IPC par socket, est-ce normal qu'un appel à send soit bloquant si aucun appel à recv n'est réalisé ?
    Par exemple, j'ai un processus Serveur qui boucle sur l'envoie d'une donnée de 6Mo et un processus client qui crée la connection mais ne fait aucun appel à recv.
    J'observe que le 1er appel à send fonctionne et met ~7ms, mais le second appel à send est bloquant. Est-ce le fonctionne logique d'une socket TCP/IP ? Faut-il obligatoirement faire des appels à recv pour vider le buffer de la socket
    et permette au send de transmettre de nouvelles données ?

    Est-il possible de paramétrer la taille du buffer de la socket au niveau de l'OS ?
    Est-il préférable de faire 1 seul appel à recv pour lire les 6Mo de données, ou est-il préférable de faire plusieurs appel à recv avec des blocs de données plus petits (64Ko, 256Ko...) ?


    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Bonjour,

    Citation Envoyé par Gawik Voir le message
    Dans un modèle de communication IPC par socket, est-ce normal qu'un appel à send soit bloquant si aucun appel à recv n'est réalisé ? Par exemple, j'ai un processus Serveur qui boucle sur l'envoie d'une donnée de 6Mo et un processus client qui crée la connection mais ne fait aucun appel à recv. J'observe que le 1er appel à send fonctionne et met ~7ms, mais le second appel à send est bloquant. Est-ce le fonctionne logique d'une socket TCP/IP ?
    En effet, c'est bien le comportement attendu. L'un des principes fondateurs de TCP est d'émuler une connexion de type flux, comme un tube, et ce même si c'est en s'appuyant sur une couche qui ne l'est pas (typiquement IP, qui fonctionne par datagrammes et dont ni l'arrivée ni l'ordre ne sont garantis).

    Par contre, si ça pose problème pour différentes raisons, tu peux paramétrer explicitement ton socket pour qu'il ne soit pas bloquant. Ce n'est pas pour cela que les données seront transmises si elles ne peuvent pas l'être, mais ça te laissera le loisir de faire autre chose en attendant.

    Faut-il obligatoirement faire des appels à recv pour vider le buffer de la socket et permette au send de transmettre de nouvelles données ?
    Dans le principe, oui. Tu dois pouvoir vider le buffer dans certains cas particuliers, mais ça dépendra beaucoup de l'implémentation locale à ta machine et, dans tous les cas, cela n'a pas de sens de permettre à un émetteur d'envoyer une grande quantité de données vers une connexion ouverte si c'est pour les ignorer avant même de les avoir reçues.

    Est-il possible de paramétrer la taille du buffer de la socket au niveau de l'OS ?
    Oui, mais ce n'est probablement pas ce que tu cherches à faire. Cela va surtout être intéressant en fonction de la montée en charge et du nombre de connexions simultanées.

    Est-il préférable de faire 1 seul appel à recv pour lire les 6Mo de données, ou est-il préférable de faire plusieurs appel à recv avec des blocs de données plus petits (64Ko, 256Ko...) ?
    Ça, par contre, ça dépend essentiellement de ton programme. Il est tout-à-fait sûr, en soi, de faire un seul gros recv() vers un buffer correctement alloué. C'est le système lui-même qui découpera le tout en datagrammes et qui le reconstituera de l'autre côté. Par contre, d'une part, allouer 6 Mo dans un tableau sous forme de variable locale (donc dans la pile) est une hérésie. Préférer un malloc() en bonne et due forme. Ensuite, si tu peux traiter tes données à la volée, il est bien entendu recommandé d'utiliser des petits buffers.

    Ensuite, si pour une raison ou une autre, la transmission se passe mal, l'appel système va échouer dans sa totalité et tu risques de devoir ré-émettre toutes tes données depuis le début.

Discussions similaires

  1. Sur un socket : send et recv ou read et write ?
    Par Médinoc dans le forum Réseau
    Réponses: 35
    Dernier message: 05/11/2009, 15h51
  2. [socket] Pb send() et recv()
    Par Tymk dans le forum C++
    Réponses: 6
    Dernier message: 03/06/2008, 18h44
  3. pb avec send et recv de mpi
    Par fatjoe dans le forum C++
    Réponses: 0
    Dernier message: 24/02/2008, 21h54
  4. socket send et recv
    Par sebatlante dans le forum Réseau
    Réponses: 24
    Dernier message: 29/08/2007, 01h34
  5. Question sur les fonctions "send()" et "recv(
    Par damien99 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 20h47

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