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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    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 éclairé
    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
    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 confirmé
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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 confirmé
    Inscrit en
    Novembre 2009
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 96
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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 ?

+ 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, 10h04
  2. Réponses: 4
    Dernier message: 13/03/2009, 18h20
  3. Réponses: 6
    Dernier message: 27/04/2008, 10h53
  4. Réponses: 1
    Dernier message: 25/09/2007, 13h58
  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, 18h49

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