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 :

Lecture de buffer important sur la fonction Recv


Sujet :

Réseau C

  1. #1
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut Lecture de buffer important sur la fonction Recv
    Bonjour a tous (ca faisais longtemps),

    j'ai une fonction qui lis les données sur un socket TCP, lis la taille, enregistre les données dans un buffer ... cette fonction fonctionne bien lorsqu'il n'y a pas de grosses données a traiter (<1Ko) . mon client postgreSQL fonctionne bien lorsqu'il y a des trames < 1ko (environ hein), mais lors de nombreux resultats que me renvoient mon serveur, ca plante ! j'ai trouvé la source du bug (difficilement), mes sockets ne sont pas bloquantes et lors d'un recv, ma fonction ne me renvoie pas toutes mes données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    enum net_socket_error
    net_socket_recv_tcp ( int net_socket, void * restrict buf, unsigned int * len )
    {
    	ssize_t received;
    	if (check(net_socket != -1, "Argument net_socket is invalid") &&
    		check(buf != NULL, "Argument buf is NULL") &&
    		check(len != NULL && *len > 0, "Argument len is NULL"))
    	{
    		received = recv(net_socket, buf, *len, 0);
     
    		if (received >= 0)
    		{
    			*len = (unsigned int)received;
    			return ((received > 0) ? NET_SOCKET_OK : NET_SOCKET_ERROR);
    		}
    		*len = 0;
    		if (net_socket_errno() == EWOULDBLOCK)
    		{
    			return NET_SOCKET_WOULD_BLOCK;
    		}
    		else
    		{
    			trace_errno();
    		}
    	}
    	return NET_SOCKET_ERROR;
    }
    example : lors ce que j'attend 1820 octets (taille de ma trame TCP pour une cinquantaine de resultats renvoyés par mon serveur), la fonction recv me renvoie que 1460 octets. si je temporise le traitement (breakpoint), cette fonction recv me lis 1820 octets et mon client ne plante pas.

    une solution a mon probleme ? merci d'avance !

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Appeler recv() en boucle jusqu'à obtenir la totalité des données attendues ?, mais puisque tes sockets sont non bloquantes je suppose que c'est une très mauvaise idée !

    Une solution un peu plus élégante tout en gardant la boucle consiste à activer un temporisateur de telle sorte que si aucune donnée n'est disponible l'appel à recv() ne retournera pas immédiatement, il ne bloquera pas non plus indéfiniment, mais juste durant un laps de temps que tu auras choisis (connaître le RTT moyen peut aider dans ce choix, une série de ping serais utile).

    Pour y parvenir je connais deux façons de faire :
    1. l'option SO_RCVTIMEO à activer via setsockopt().
    2. select()


    La plus portable et celle à base de select().

    Bon courage.

Discussions similaires

  1. Lenteur lecture BLOB sur Windows7x64 (fonctione sous XP)
    Par thy31 dans le forum Connexion aux bases de données
    Réponses: 0
    Dernier message: 01/02/2015, 17h20
  2. Réponses: 9
    Dernier message: 02/09/2008, 13h52
  3. Question sur la fonction recv
    Par Mr_Chut dans le forum Réseau
    Réponses: 14
    Dernier message: 15/09/2006, 12h43
  4. Question sur les fonctions "send()" et "recv(
    Par damien99 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 20h47
  5. PerlDoc sur une fonction d'un module
    Par lesouriciergris dans le forum Modules
    Réponses: 2
    Dernier message: 13/03/2003, 20h50

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