WINSOCK : Envoi / Reception de structures [Résolu]

Signaler
Messages postés
25
Date d'inscription
dimanche 26 octobre 2003
Statut
Membre
Dernière intervention
13 septembre 2005
-
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
-
Bonjour,



J'ai commencé a ecrire une classe permettant, en fonction de la facon
dont on l'instancie, de gerer une connection cliente ou serveur : pour
cela j'utilise des sockets.



Pour l'instant tout fonctionne a merveille mais je bute sur un probleme
: je souhaiterai pouvoir envoyer tout type de données ( pas seulement
des chaines de caracteres )



voila un exemple pour bien me faire comprendre :





//*********************************************//

// une structure de données quelconque

struct TStruct

{

char Chaine[20];

int Entier;

};



// les fonctions que j'utilise pour l'envoyer et la recevoir ( les fonctions de base de winsock2.h )

int send ( SOCKET s, char *buffer, int bufferLen, int flag);

int recv ( SOCKET s, char *buffer, int bufferLen, int flag);



// ce que j'ai essayé mais qui ne marche pas ( je vous montre que le send, ca suffit pour

// comprendre :) )

SOCKET MonSocket;

TStruct MesDonnees;

.....

send (MonSocket, (char*)&MesDonnees,strlen( (char*)&MesDonnees ), 0);


//*********************************************//



Donc voila ! Jusque la je pensais que d'une facon ou d'une autre il
etait possible de transtiper tout ce qu'on voulait en chaine de
caractere ( par exemple ca fonctionne pour la fonction d'ecriture en
binaire dans une fichier de iostream.h ). Mais j'ai peu etre tord ...

En tous les cas si vous connaissez la bonne methode pour transtiper ,
ou des fonctions send/recv differentes qui me permettront de faire ce
que je veux, je suis preneur !



merci d'avance :)






Smoove

7 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Le troisieme param est la taille des données, or avec le strlen((char*) &MesDonnees) tu retournes simplement la taille de la chaine Chaine de ta structure.
Il faut plutot passer sizeof(struct TStruct) en troisieme param.
Messages postés
25
Date d'inscription
dimanche 26 octobre 2003
Statut
Membre
Dernière intervention
13 septembre 2005

!!! merci aardman :)



Mon erreur etait un peu idiote je m'en rend compte :s J'avais
pensé que strlen () retourne un nombre de char, et donc, un nombre
d'octets*2 ... dans cette optique sizeof () ne donnerai pas la bonne
valeur selon moi :x



Enfin c bon , avec sizeof ca marche , merci encore !

Smoove
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonjour,



Juste une question :



send (MonSocket, (char*)&MesDonnees,sizeof(struct TStruct), 0);

tu envoies l'adresse de ta structure, mais si c'est deux postes differents ???



Matt...
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Matt67> ici on envoit pas l'adresse de la structure, mais son contenu.
je vois pas le probleme?
Messages postés
25
Date d'inscription
dimanche 26 octobre 2003
Statut
Membre
Dernière intervention
13 septembre 2005

Oui Matt67, aardman a raison, (char*)(&MesDonnees) ce n'est
que du transtypage , c'est a dire qu'on tranforme la structure en une
chaine de caractere ( chaine --> char*).

Mais le compilateur ne comprend pas (char*) MesDonnees , il s'attend a
ce que MesDonnees soit un pointeur, donc on met le & devant pour
qu'il s'y retrouve ( c purement de la syntaxe je dirait , le resultat
est que l'on envoi quand meme la structure , et pas son adresse)


En esperant avoir compris ta question ^^


Smoove
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonsoir,



Merci pour ces precisions.

Etant un peu comme St Thomas, j'ai verifié hier soir et exact ca marche.

Matt...
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonjour,



Merci pour ces precisions.

Etant un peu comme St Thomas, j'ai verifié hier soir et exact ca marche.


Bonne Journée,


Matt...