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 :

Probleme de memoire lors de la lecture d'une socket


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Probleme de memoire lors de la lecture d'une socket
    bonjour,
    J'ai fais un sous programme qui peut récupérer des requètes de longueur quelconque en lisant sur une socket.
    Pour cela j'ai un buffer qui stoke des données de la socket et les réinjecte dans une plus chaine de caractère(requete) qui est réallouée a chaque fois qu'un nouveau buffer désire stoker de nouveaux caractères. Requete contient donc toute ma requete normalement.
    Mon problème est que ce sous-programme fonctionne parfaitement lors de son premier appel. Mais lors de son second appel il fait segmentation fault/ou erreur de bus(sous solaris) sur le réalloc et fait realloc(): invalid next size sous mandriva. Je ne comprend pas bien ces erreurs, les paramètre passé dans le réalloc son bon (taille_req = 64 et requete n'est pas null)je ne trouve pas mon bug.
    Je joins mon code si quelqu'un jette un oeil.
    Merci d'avance

    Arnaud
    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
    28
    29
    30
    31
    32
    33
     
    char * lire_socket(int nsock) {
            int taille_req = TAILLE_BUFF;
    	int retour = TAILLE_BUFF;
    	char* requete = NULL;
    	char buffer[TAILLE_BUFF];
     
            requete = malloc( TAILLE_BUFF* sizeof(char));
    	bzero(requete,TAILLE_BUFF * sizeof(char));
    	bzero(buffer, TAILLE_BUFF * sizeof(char));
            retour = read(nsock, buffer, TAILLE_BUFF);	
    	strncat(requete, buffer, retour);
     
     
     
    	/* Boucle de lecture */
    	while((retour == TAILLE_BUFF)) {
     
        	    bzero(buffer, TAILLE_BUFF * sizeof(char));	
                retour = read(nsock, &buffer[0], TAILLE_BUFF);
    	    taille_req = taille_req + retour;
    	    printf("taille = %i\n", taille_req);
    	    /*printf("requete = %s\n",requete);*/	    
    	    printf("flag\n");
    	    requete = realloc(requete, taille_req * sizeof(char));
    	    printf("flag1\n");	    
    	    strncat(requete, buffer, retour);
    	    printf("flag2\n");
            }
     
    	/*printf("requete lue = %s\n",requete);	*/
    	return(requete);
    }

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par arover Voir le message
    Je joins mon code si quelqu'un jette un oeil.
    C'est trop compliqué pour que je regarde en détail... Je préconise ceci :

    http://emmanuel-delahaye.developpez....eaux.htm#texte

    qui peux s'étendre au mode binaire...

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour, je ne vois pas vraiment d'agorithmes qui correspondent à ce que je veux realiser,
    i.e recuperer une requete de taille inconnue potentiellement grande( images, video etc...).
    C'est pour cela que j'utilise realloc, et c'est sur ce point que j'ai une erreur que je ne comprends pas.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par arover Voir le message
    Bonjour, je ne vois pas vraiment d'agorithmes qui correspondent à ce que je veux realiser,
    i.e recuperer une requete de taille inconnue potentiellement grande( images, video etc...).
    C'est pour cela que j'utilise realloc, et c'est sur ce point que j'ai une erreur que je ne comprends pas.
    Si c'est un fichier, la taille a été transmise par le protocole (FTP etc.) et elle est donc connue.

    Si c'est du streaming, on doit mémoriser la quantité de données suffisante pour assurer les traitements en continu malgré une irregularité de l'approvisionnement (buffering). Je preconise un buffer tournant de trames préallouées.

    Mais si tu tiens à realloc(), il faut l'utiliser dans les règles :

    http://emmanuel-delahaye.developpez....es.htm#realloc

    évidemment, la taille n'est pas infinie. De plus, si on atteint les limites de la RAM, la mémoire virtuelle sur disque est lente et les swaps peuvent ralentir fortement tout le bazar...

    Il n'y a en principe aucune raison de mémoriser de grosses quantité de données en mémoire.

    S'agirait-il d'activités peu légales, comme l'enregistrement de streaming?

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjours ,
    non ce n'est pas pour enregistrer du streaming que je faisais ce programme c'étais pour réaliser un proxy. je pense avoir trouver mon erreur, vu que je dois laisser un \O en fin de chaine il fallais surement allouer TAILLE_BUFFER +1.
    Enfin toujours est'il que je dois avoir un autre souci car plus tard dans le code j'ai un segfault plus ou moins alléatoire selon les pages que je charge sur gethostbyname. Merci pour tout
    Arnaud

Discussions similaires

  1. Problème de drivers lors de la creation d'une image
    Par hebus2782 dans le forum Réseau
    Réponses: 13
    Dernier message: 09/06/2006, 16h02
  2. Réponses: 3
    Dernier message: 09/04/2006, 13h04
  3. Probleme de cache lors de la recup d'une page web
    Par firejocker dans le forum MFC
    Réponses: 1
    Dernier message: 22/12/2005, 17h00
  4. Lenteur lors de la lecture d'une base Access
    Par Lio590 dans le forum Bases de données
    Réponses: 6
    Dernier message: 16/11/2005, 12h24
  5. Probleme de BIP lors de la lecture d'un fichier
    Par GroRelou dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 21/09/2005, 10h12

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