Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juin 2012
    Messages : 12
    Points : 3
    Points
    3

    Par défaut Discussion client serveur, socket TCP

    Bonjour,

    Le probleme se situe au niveau de l'affichage de mon message, on en communication client vers serveur:

    Code :
    1
    2
    3
    4
    5
    6
    7
    // Cote serveur
    char MessageRecv[100];
    read(fdaccept,MessageRecv,sizeof(MessageRecv));
    printf("%s",MessageRecv);
    // Coté client
    char MessageEnvoi[]="test";
    send(sockfd,MessageEnvoi,strlen(MessageEnvoi),0);
    Mon message test s'affiche correctement mais j'ai droit a des carcteres(spéciaux) en plus:
    test�zH`J��J���J��TzH

    Donc question, d'ou vienne ces caracteres et comment y remédier?

    Merci de m'éclairer.

  2. #2
    Invité de passage
    Homme Profil pro
    Inscrit en
    juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juin 2012
    Messages : 12
    Points : 3
    Points
    3

    Par défaut Solution

    Bon j'ai tellement honte d'avoir posté cette question mais bon je laisse la discussion au cas où une autre personne serait dans le meme cas.

    La solution: initialiser son tableau a zéro ><
    char MessageRecv[100]="0";

    c'est tout.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 471
    Points : 13 988
    Points
    13 988

    Par défaut

    Bonjour,

    C'est un poil plus subtil. Lorsque tu écris

    Code :
    char MessageRecv[100]="0";
    … tu n'initialises pas le tableau à zéro, mais tu le remplis avec la chaîne que tu passes. Donc, la première position contient le caractère « 0 » (code ASCII 48) puis le terminateur (code ASCII 00). Il se trouve toutefois que la norme précise que dans le cas d'une initialisation avec une chaîne entre guillemets ou une liste de valeurs entre accolades, une fois leur fin atteinte, les éléments du tableau restants sont initialisés de la même façon que les objets à stockage statique, qui eux-mêmes sont initialisés à zéro. Donc, dans les faits, ton tableau sera quand même rempli de zéros.

    Par contre, read() et send() peuvent envoyer n'importe quel type de données et, donc, pas forcément des chaînes formattés à la mode C. Il faut donc récupérer la valeur de retour de read() qui, selon qu'elle est positive, nulle ou négative, t'indique respectivement une erreur, une fin de transfert ou la longueur des données que tu viens de recevoir.

    C'est important parce qu'il est tout-à-fait possible, lorsque ta chaîne est longue, que tu reçoives tes données en plusieurs fois.

  4. #4
    Invité de passage
    Homme Profil pro
    Inscrit en
    juin 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juin 2012
    Messages : 12
    Points : 3
    Points
    3

    Par défaut

    Merci beaucoup, pour t'es explications c'est gentil.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •