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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    18
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    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 �prouv�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    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 averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    18
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    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 chevronn� 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
    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 averti
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    18
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 18
    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 chevronn� Avatar de niglo
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    379
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 379
    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 confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    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 chevronn� 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
    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