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 :

Chaine de caractères dynamique


Sujet :

Réseau C

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut Chaine de caractères dynamique
    Bonsoir,

    j'ai écrit un petit programme en C qui permet à un serveur de recevoir une chaine de caractères envoyée par un client, alors au lieu d'utiliser un buffer je veux utiliser une chaine de caractères dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine = malloc(255 * sizeof(char*))
    je reçois toujours les 4 premiers caractères seulement je ne sais pas pourquoi ? Pourtant quand j'utilise un buffer tout marche bien

    Merci pour votre aide.
    E.BAZAOGA

  2. #2
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut
    Bonsoir, sans autres info, on ne pourra pas vous aider, pour la simple bonne raison que ne nous somme pas devin (enfin, pas pour ma part).
    Il faudrait nous montrer la procédure d’envoi du client, ainsi que la procédure de réception du serveur. Mais aussi qu'est ce que vous voulez dire par buffer (cette chaine peut être utilisée comme buffer). Bref, soyez plus précis.

    edit1: et si c'est une chaine, c'est une suite de char donc sizeof(char)

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut
    Merci pour la réponse, voici une partie du code "Coté serveur" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    chaine = (char*)malloc(sizeof(char)*255);
    recu = recv(desc_sock_trans,chaine,sizeof(chaine),0);
     
     if(recu < 0){
                printf("Pb Reception");
    	    exit(0);	
      }
     
     chaine[recu]='\0';
     printf(" \n\t j'ai reçu : %s de taille %d \n",chaine,recu);
    quand je remplace cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine = (char*)malloc(sizeof(char)*255);
    par une simple déclaration d'un tableau de caractères tout marche

    j'espère que j'ai bien expliqué mon problème.
    Merci à vous.

  4. #4
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 851
    Points : 2 293
    Points
    2 293
    Par défaut
    Si t'as besoin de caster ton malloc c'est que tu compiles en c++. Change de compilo. Autre chose, dans les echanges reseau il est general utile de faire en sorte de savoir la taille du message. Je vois 3 facons de le faire :

    - le message fera toujours x octets donc la pas de probleme
    - on envoie la taille du message dans les 4 premiers octets, apres il suffit de boucler sur cette taille pour recuperer le message
    - on determine un caractere de fin de message ('\n' par exemple)

    Comme ca tu pourras etre plus efficace dans la gestion de tes allocations memoire.

    La condition d'erreur de recv en mode bloquant (par defaut donc) est :

    Et non pas :


  5. #5
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut
    tout d'abord merci pour ton aide, en fait je sais qu'il existe d'autre solution plus efficace pour traiter ce problème "tailles de la chaine inconnues." cependant l'allocation dynamique y parmi les solutions donc :

    pourquoi cette ligne ne permet pas de réserver une place mémoire nécessaire à recevoir ma chaine ???!!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     chaine = malloc(25 * sizeof(char));
    Merci encore une fois
    E.Bazoga

  6. #6
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 851
    Points : 2 293
    Points
    2 293
    Par défaut
    Exemple tout simple :

    - d'un cote tu envoies une chaine de 458 caracteres
    - de l'autre tu as ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine = malloc(25 * sizeof(char));
    Il va se passer a ton avis si tu veux stocker tout le message dans ton buffer de 25 caracteres ?

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par imperio Voir le message
    Il va se passer a ton avis si tu veux stocker tout le message dans ton buffer de 25 caracteres ?
    : je ne suis pas aussi naif

    même si ce n'est pas le cas, à la reception je doit recevoir les 25 premiers caractère alors que dans mon cas j'obtiens seulement 4 caractères.

    A votre avis, après l’exécution de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine = malloc(25 * sizeof(char));
    j'obtiens 4 est ce qu'il est normale?!!

    Merci a vous.
    E.bazoga

  8. #8
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut
    Je vois que personne n'a relevé ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ssize_t recv(int socket, void *buffer, size_t length, int flags);
    Or tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    recu = recv(desc_sock_trans,chaine,sizeof(chaine),0);
    length
    Specifies the length in bytes of the buffer pointed to by the buffer argument.
    or ici, sizeof(chaine) est la taille du pointeur et non la taille du buffer


    edit: Sur un systeme 32bits, les pointeurs ont une taille de 4 octets, c'est donc de la d'ou vient ton 4 magique

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par EpiTouille Voir le message

    Sur un systeme 32bits, les pointeurs ont une taille de 4 octets, c'est donc de la d'ou vient ton 4 magique


    Bien vu et Merci bien pour ton aide.
    E.bazoga

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. construire une chaine de caractères dynamiquement
    Par mounir31400 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/05/2015, 11h04
  2. Réponses: 4
    Dernier message: 13/03/2009, 19h20
  3. Réponses: 6
    Dernier message: 27/04/2008, 11h53
  4. Réponses: 1
    Dernier message: 25/09/2007, 14h58
  5. Découpage dynamique d'une chaine de caractère
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/10/2005, 19h49

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