Envoi de classe avec send

Signaler
Messages postés
5
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
17 juillet 2003
-
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006
-
Bonjour,

Je voudrai envoyer une classe grace à un send.
Par exemple cette classe :

class Donnees
{

int        Type;
int        Taille;
double  **Donnees;

public:
Donnees();
virtual ~Donnees();
...
};


Si je fais :
Donnees *data = new Donnees;
send(sock, (char*)data,sizeof(data), 0);


Je ne recupere rien avec le recv.

Quelqu'un peu m'expliquer pourkoi? Ou alors me donner un exemple d'envoi d'autre chose qu'un char*.

Merci

7 réponses

Messages postés
515
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
27 avril 2006
1
Est ce que tu est sur que le serveur doit te renvoyer quelque chose après la réception de ton paquet ? Sinon, essaye avec des char[1024] (bizarement, j'ai déja eu des problème avec les char* en socket)
Et pi tu na pas besoin de mettre "(char*)data", un "data" tout court suffit je crois
_________________________
Heureux l'étudiant qui comme la rivière peut suivre son cours sans quitter son lit
Messages postés
5
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
17 juillet 2003

J'ai fait le serveur donc je c que quand je me connecte il doit m'envoyer des données contenues dans data qui est une instance de la classe Donnees. Ca marche si je lui envoi un char, mais si je veu envoyer une classe ca marche pas. Et si je ne met pas le "(char*)data" ca me fait une erreur pke data c'est pas un char*...
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Normal que ca ne marche pas, c'est un peu du n'importe quoi ce que tu essayes de faire, tu envois l'adresse de l'instance d'une classe sur une machine A et tu espères que la machine B fera quelques choses de cette adresse. Or cette adresse mémoire est une adresse dans la mémoire de la machine A, la machine B ne peut absolument rien en faire.

Si tu veux transmettre des objets via un socket, il faut que tu mettes en place le mécanisme de sérialisation. Soit tu dérives tes classes de classes MFC, soit tu utilises une bibliothèque externe ou tu la gère à la main. Ta classe ainsi sérialisée sera capable grâce à deux méthodes:

- De mettre dans un tableau de caractères (ou autre) la valeur de tous les attributs de l'instance,

- Et, à partir de cette chaine, de recréer un objet complétement identique au premier.

Quand tu auras mis en place ce mécanisme, il suffira de faire "naviguer" des chaines de caractères sur le réseau.

Kaid - kaid.fr.st
Messages postés
5
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
17 juillet 2003

Ok j'veu bien mais tu peu expliquer comment faire?
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Regardes ces deux sources de vieuxLion sur la sérialisation en MFC, c'est la méthode la plus simple.

LA SÉRIALISATION MFC ACCESSIBLE EN MODE CONSOLE !!!

[http://www.cppfrance.com/article.aspx?ID=1473 LA SÉRIALISATION AVEC VC++6 [MFC] COMPRENDRE ET METTRE EN OEUVRE ]

Kaid - kaid.fr.st
Messages postés
5
Date d'inscription
lundi 12 mai 2003
Statut
Membre
Dernière intervention
17 juillet 2003

Ok merci, j'ai juste une autre petite question :
recv c'est une instruction bloquante non? tant qu'il n'a rien recu il attend?
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Oui.

Kaid - kaid.fr.st