IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Envoyer des instances de classes via TCP


Sujet :

C++

  1. #1
    Membre chevronn�
    Avatar de ZouBi
    Inscrit en
    Octobre 2007
    Messages
    508
    D�tails du profil
    Informations professionnelles :
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 508
    Par d�faut Envoyer des instances de classes via TCP
    Bonjour,
    voici les deux prototypes :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    int SDLNet_TCP_Send(TCPsocket sock, void *data, int len);
    int SDLNet_TCP_Recv(TCPsocket sock, void *data, int maxlen);
    Je poss�de une classe "Personnage", dont j'en fais une instance, et que je souhaite envoyer au serveur.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    Personnage p();
    SDLNet_TCP_Send( sock, &p, sizeof( Personnage );
    Jusqu'ici, aucun soucis, mais c'est lors de la r�ception au serveur, du personnage que celui-ci me fait une erreur de segmentation.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    Personnage p();
    SDLNet_TCP_Recv( sock, &p, sizeof( Personnage );
    voil�, et l� une erreur de segmentation.
    La classe Personnage poss�de un constructeur par copie, ainsi qu'une surcharge de l'op�rateur d'affectation.

    Je pensais au d�but qu'on pouvait pas envoyer d'instance via TCP, mais j'ai pourtant essayer avec des entiers ( en remplacant les types Personnage par des int ) et j'ai toujours des erreurs de segmentation, donc je sais pas comment faire, si vous pouvez m'aider.

  2. #2
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par d�faut
    On me d�trompera peut-�tre, mais il me semble qu'au lieu d'envoyer une classe sur le r�seau, on envoie plut�t ses donn�es. Essaie plut�t de faire une m�thode dans ta classe (std::string Personnage::ToMessage()) qui renvoie une cha�ne de caract�re contenant les donn�es de ta classe de mani�re format�e (des mots ou chiffres s�par�s par des ';', par exemple, � toi de voir ce qui est n�cessaire pour instancier un Personnage), et � l'autre bout fait une fonction (ou une m�thode de classe) qui permet d'analyser la cha�ne re�ue, d'en extraire les donn�es n�cessaires, et de construire un Personnage � partir de �a.

  3. #3
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    Ton probl�me s'appelle la serialisation ou aussi le marshalling.

    Comment transmettre une classe ou des donn�es d'un PC � l'autre sachant qu'ils ne partagent pas de m�moire commune. Vu que la m�moire n'est pas partag�e, un pointeur ne se transmet pas, il faut absolument le d�r�f�rencer et s�rialiser.

    Vu que tu es dans un forum c++, je peux continuer sur les autres classes standard, comment transmettre un vector

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    send(socket, &vector, sizeof(vector));
    et � l'autre bout
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    recv(socket, &vector, sizeof(vector));
    C'est le crash assur�.

    Il va donc falloir que tu parcours chacuns des membres de ta classe, que tu les envoies sur le socket et qu'� l'autre bout, tu les recoives et reconstruises ta classe de toute pi�ce.
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  4. #4
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    ram_0000 a raison... Et c'est pourquoi je te conseille de lire la s�rialisation avec Boost. Ensuite, tu as donc � s�rialiser, envoyer la chaine � l'autre ordi, et d�-s�rialiser.

  5. #5
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Et accessoirement, ton autre probl�me c'est que ceci d�clare une fonction :
    Ceci par contre d�clare bien une instance de Personnage :

  6. #6
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    Citation Envoy� par Laurent Gomila Voir le message
    Et accessoirement, ton autre probl�me c'est que ceci d�clare une fonction :
    Heu non, ceci d�clare bien une instance de Personnage nomm�e "p" et dont ont ne passe aucun param�tre au constructeur. C'est strictement equivalent �

    mais peut �tre moins facile � lire (quoique)
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  7. #7
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Et non, c'est un pi�ge.

    Est bien une d�claration de fonction. A comparer avec :

    Quand il y a ambigu�t�, le compilateur doit pr�f�rer la d�claration de fonction. Il y a des cas encore pires...


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    struct A
    {
    	A() {}
    };
     
    struct B
    {
    	B(A a1, A a2) {}
    	void f() {}
    };
     
    int main()
    {
    	int i = 12;
    	B b1 (A(i), A());  // déclare une fonction b1
    	B b2 (A(12), A()); // déclare une variable b2
    }
    b1 est une fonction prenant deux param�tres, et retournant un objet de type B.
    Le premier param�tre, nomm� i (avec des parenth�ses en trop, mais c'est pas grave), de type A.
    Le second param�tre, non nomm� de type : pointeur sur une fonction ne prenant pas d'argument et retournant un A.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  8. #8
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    Oups, j'aurai dit une grosse connerie !!! Et aussit�t, je pris mon compilateur...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    class A
    {
    public:
       A(int param = 12)
       {
          printf("A constructor(%d)\n", param);
       }
    };
    Avec ce code:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void main()
    {
       A tst();
    }
    J'ai ce warning : warning C4930: 'A tst(void)'*: fonction prototyp�e non appel�e (�tait-ce la d�finition de variable souhait�e*?)

    Avec ce code:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void main()
    {
       A tst(10);
    }
    Pas de warning et j'ai le comportement souhait�.

    Avec ce code:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void main()
    {
       A *tst = new A();
    }
    Pas de warning non plus et j'ai le comportement souhait�.

    Donc mes excuses Laurent Gomila, tu avais raison et merci JolyLoic d'avoir rectifi� mon erreur, j'aurai au moins appris une chose aujourd'hui.
    Raymond
    Vous souhaitez participer � la rubrique R�seaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs syst�me et r�seau � configurer leurs �quipements SNMP r�seau.
    e-verbe Un logiciel de conjugaison des verbes de la langue fran�aise.

    Ma page personnelle sur DVP
    .

  9. #9
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    Pourquoi utilises tu des pointeurs et des new alors qu'il n'y en a absolument pas besoin, et qu'au contraire �a apporte rien que des probl�mes ?

Discussions similaires

  1. Instance de classe via DLL
    Par Fire Angel dans le forum Langage
    R�ponses: 4
    Dernier message: 31/08/2009, 16h44
  2. Cr�er des instances de classes EMF dans Eclipse avec une jolie IHM
    Par obernard dans le forum Eclipse Platform
    R�ponses: 3
    Dernier message: 24/02/2009, 19h21
  3. R�ponses: 4
    Dernier message: 28/03/2007, 22h23
  4. R�ponses: 6
    Dernier message: 23/02/2006, 20h23
  5. Conditions de destruction des instances de classes
    Par elvivo dans le forum G�n�ral Python
    R�ponses: 4
    Dernier message: 29/12/2004, 17h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo