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 : fonction recv.


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Socket : fonction recv.
    Bonjour,

    J'utilise une socket TCP/IP tres classique.
    Je fais un send d'un buffer d'une taille constante et je m'apercois que, de temps en temps, je dois faire 2 recv afin d'obtenir l'intégralité de mon buffer!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    n=recv(sock,(char*)&buff,2964,0);
    if(n!=2964)
          n+=recv(sock,(char*)&buff+n,2964-n,0);
    Je précise que je fais un setsockopt afin d'avoir des buffers d'envoi et de reception suffisant.

    Est ce normal ???
    Y a til une explication ???
    Exite il un moyen de forcer le reception en 1 seul recv ???

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 104
    Points
    104
    Par défaut
    Bonjour

    Moi aussi j'ai deja rencontre le meme probleme....
    Je crois que c'est une question de temps de reception qui est un peu trop long.... La solus faire plusieurs recv (jusqu'a que tu es le bon nombre de bytes) .


    J'en connais pas d'autre

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Ok,
    Je suppose qu'il est inutile de jouer avec SO_RCVTIMEO et SO_SNDTIMEO...

    Mais est ce que qq'un a une explication ???
    Ou peut etre une solution...

  4. #4
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Une explication possible est peut-etre la fragmentation ? Un lien ethernet accepte des paquets de 1500 octets maximum. Si tu envoie 2394 octet d'un coup, il va falloir deux paquets pour faire passer sur ethernet.

    Mais ca me parait étrange que l'on est accés qu'a une partie d'un message tcp ( même si c'est la première ). Donc je ne suis pas sur.

    Au passage, c'est pas tres bien de hardcodé ca dans le code. Au pire, fais un
    #define MAX_SIZE 2394

    ou tu peux surement utiliser sizeof(buf) ici, je ne sais pas.

    Pourquoi vouloir envoyer autant d donnée d'un coup ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Effectivement, la taille des paquets est de 1500 octets en ethernet et aussi en UDP (je crois) mais en TCP normalement il n'y a pas de taille de paquets limite... (enfin je crois...)

    D'autant plus que lorsque ce phenomene se produit le premier paquet est tjr de 2920 et le second de 44 !!!!

    Sinon le Hardcodage c'est juste pour l'exmple de code..., et je transmet de gros paquet car c'est une var d'état d'environ 150 machines pour faire une sorte de supervision... enfin bref, j'ai pas trop le choix...

  6. #6
    Membre averti Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par thieum74
    en TCP normalement il n'y a pas de taille de paquets limite... (enfin je crois...)

    Biensur qu'il y a une taille de paquet limite, c'est juste que pour toi c'est transparent. La taille est limitée par le paquet IP (et non tcp ou udp, ca c'est le nom du protocole de transport des paquets).

    Tu fais un send, et après le message que tu veux envoyer est découpé en plusieurs paquets par le protocole choisit !!!

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut Re: Socket : fonction recv.
    Je suis sûr que tu n'as certainement pas voulu écrire ça.
    Citation Envoyé par thieum74
    (char*)&buff
    Sinon pour ton pb, je ne saurais dire. Un problème de timeout peut-être ? Et encore il me semble que les codes de retour devraient être différents. Le forum réseau conviendra certainement bien mieux que le forum d'un langage qui ne sait pas ce qu'est une socket.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Le man de recv de ma debian indique le flag

    MSG_WAITALL
    This flag requests that the operation block until the full
    request is satisfied. However, the call may still return less
    data than requested if a signal is caught, an error or discon-
    nect occurs, or the next data to be received is of a different
    type than that returned.
    qui devrait resoudre ton probleme. Je ne sais pas si c'est portable par contre.

Discussions similaires

  1. [socket] résultat de la fonction recv
    Par alana dans le forum Débuter
    Réponses: 4
    Dernier message: 22/07/2008, 13h14
  2. Réponses: 2
    Dernier message: 31/05/2005, 09h50
  3. [winsock.h] Fonction recv() pour un socket en C
    Par Hikaru dans le forum Windows
    Réponses: 5
    Dernier message: 22/05/2004, 07h43
  4. Gestion de sockets: fonction Accept
    Par keupon dans le forum MFC
    Réponses: 12
    Dernier message: 22/01/2004, 18h48
  5. fonction recv()
    Par billyboy dans le forum Développement
    Réponses: 2
    Dernier message: 04/10/2003, 17h52

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