Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Réseau
Réseau Forum d'entraide sur la programmation réseau en C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/12/2012, 23h24   #1
darktimide
Invité de passage
 
Homme
Inscription : juin 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2012
Messages : 12
Points : 2
Points : 2
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.
darktimide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 17h08   #2
darktimide
Invité de passage
 
Homme
Inscription : juin 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2012
Messages : 12
Points : 2
Points : 2
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.
darktimide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 17h45   #3
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 087
Points : 11 087
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.
Obsidian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2012, 21h18   #4
darktimide
Invité de passage
 
Homme
Inscription : juin 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2012
Messages : 12
Points : 2
Points : 2
Merci beaucoup, pour t'es explications c'est gentil.
darktimide est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h37.


 
 
 
 
Partenaires

Hébergement Web