Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
struct avec char * a transporter sur le reseau
Envoyé par: madko

voila si on dispose d'une structure contenant diverses variables dont un char * comment fait t'on pour l'envoyer avec send()?
car on lui donne l'adresse de la structure et sa taille, ça va donc bien tout lire sauf que ça va envoyer l'adresse du char * et non son contenu

un ptit exemple pour etre plus clair

Citation

struct paquet
{
int entier;
char *texte;
} P;

P.entier = 1;
P.texte = calloc(10,sizeof(char));
strncpy(P.texte,"salut",10);

send(socket,&P,sizeof(P),0);

donc avec ça a moins que jme trompe j'ai aucune chance de retrouver "salut" sur la machine distante. une idée sur comment s'y prendre?

Poste le Friday 17 June 2005 22:36:23
Répondre     Citer    
Re: struct avec char * a transporter sur le reseau
Envoyé par: Sve@r

Tu as tout à fait raison. Ce problème se retrouve aussi en C++ lorsqu'on recopie des objets qui contiennent des pointeurs. Il faut faire son propre opérateur de copie (le "=") pour veiller à recopier les éléments pointés.

La manière la plus simple pour copier ta chaîne via une socket est qu'elle n'ait pas été allouée dynamiquement. En ayant un "char texte[1024]" par exemple c'est bon puisque toute ta chaîne est dans ta structure.

Tu risques d'ailleurs d'avoir un autre problème avec ton "P.entier". En effet, le codage d'un entier dépend de l'architecture du système. Sur un système il est codé de gauche vers droite et sur un autre de droite vers gauche. Si tu communiques avec des systèmes identiques ça ira mais si tu transfères ce "P" de Unix vers Windows, tu risques de ne jamais retrouver "1" à l'arrivée.

Va sur mon site [fr.lang.free.fr] tu y trouveras un cours sur l'implémentation des sockets qui explique comment résoudre ce pb.

Quand au "char *", si t'es vraiment obligé de le mettre ben il faudra alors magouiller (passer par une chaîne intermédiaire, etc)

Salut

Poste le Saturday 18 June 2005 07:50:24
Répondre     Citer    
Re: struct avec char * a transporter sur le reseau
Envoyé par: Sve@r

Citation
Sve@r
Quand au "char *", si t'es vraiment obligé de le
mettre ben il faudra alors magouiller (passer par
une chaîne intermédiaire, etc)

ou alors transférer ta structure membre par membre
send(socket, P.entier, sizeof(P.entier), 0);
send(socket, P.texte, strlen(P.texte) + 1, 0);


Poste le Saturday 18 June 2005 09:15:06
Répondre     Citer    
Re: struct avec char * a transporter sur le reseau
Envoyé par: madko

bon jsuis passé comme tu la dit par un intermediaire, j'ai fait un ptit void * de la taille de ma struct sans le char *, jlai copié dedans avec mempcy comme ça je chope l'adresse de la fin de cette partie et j'enchaine avec le char * smiling smiley

et sinon si je send en plusieurs fois, l'autre en face pourra le recv en un seul coup?

jvais aller voir ton lien mais c'est pour un environnement homogene (que du linux x86) ça devrait rouler tout seul

Poste le Saturday 18 June 2005 13:29:38
Répondre     Citer    
Re: struct avec char * a transporter sur le reseau
Envoyé par: madko

j'oubliais le principal: merci smiling smiley

Poste le Saturday 18 June 2005 13:30:14
Répondre     Citer    
Re: struct avec char * a transporter sur le reseau
Envoyé par: Sve@r

Citation
madko
bon jsuis passé comme tu la dit par un
intermediaire, j'ai fait un ptit void * de la
taille de ma struct sans le char *, jlai copié
dedans avec mempcy comme ça je chope l'adresse de
la fin de cette partie et j'enchaine avec le char
* smiling smiley

et sinon si je send en plusieurs fois, l'autre en
face pourra le recv en un seul coup?

jvais aller voir ton lien mais c'est pour un
environnement homogene (que du linux x86) ça
devrait rouler tout seul

J'ai pas trop compris ton histoire de "void * sans le char * etc"

En revanche, si tu fais 2 "send" faut que de l'autre coté tu fasses impérativement 2 "recv" !!!

Poste le Saturday 18 June 2005 17:27:11
Répondre     Citer    
Re: struct avec char * a transporter sur le reseau
Envoyé par: madko

jvais essayer d'etre plus clair avec mes void * et char *. c'etait juste pour dire que je copiait d'abord toute les variables de ma structure qui sont reellement contigues en mémoire (cad tout sauf les pointeurs) dans mon tampon (mon void *, peu importe en fait) et apres j'y copie a la fin ce qui est en fait pointé par le char * present dans la struct. en fait j'ai repris le meme principe que quand tu sauvegarde une structure dans un fichier. bon jsuis pas sur que ça soit plus clair smiling smiley
enfin bon javais poser cette question pour etre sur de pas passer a coté d'une methode toute simple

Poste le Saturday 18 June 2005 19:51:59
Répondre     Citer    
Re: struct avec char * a transporter sur le reseau
Envoyé par: Sve@r

Citation
madko
jvais essayer d'etre plus clair avec mes void * et
char *. c'etait juste pour dire que je copiait
d'abord toute les variables de ma structure qui
sont reellement contigues en mémoire (cad tout
sauf les pointeurs) dans mon tampon (mon void *,
peu importe en fait) et apres j'y copie a la fin
ce qui est en fait pointé par le char * present
dans la struct. en fait j'ai repris le meme
principe que quand tu sauvegarde une structure
dans un fichier. bon jsuis pas sur que ça soit
plus clair smiling smiley
enfin bon javais poser cette question pour etre
sur de pas passer a coté d'une methode toute
simple

oui oui, j'ai compris
Tu crées une grosse zone mémoire et tu y bazardes toutes tes variables à la suite puis tu envoies la grosse zone via socket.

En fait, comme une structure c'est une grosse zone mémoire, tu pourrais utiliser cet item pour travailler. Cela serait probablement plus facile au niveau prog qu'utiliser une grosse zone mémoire sans structure...

Poste le Saturday 18 June 2005 22:13:16
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
struct avec char * a transporter sur le reseau
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons