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

SDL Discussion :

transfert d'objet avec SDL_Net


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut transfert d'objet avec SDL_Net
    Bonjour a tous,

    Je developpe un petit jeu en reseau et j'ai besoin de creer une interface client-serveur.

    J'etais habitué a la serialisation des objets en java, j'ai donc cherché comment faire pour effectuer la meme operation en c++.

    J'ai regardé la structure du SDL_Net_Send et du SDL_Net_Recv, et j'ai constaté que les données etaient du type void *:

    SDLNet_TCP_Send(sock,void* donnees,int size)
    SDLNet_TCP_Recv(sock,void* donnees,int size)

    J'ai donc essayé d'envoyer mon objet, et de le caster a la reception.

    (j'ai un objet de type Loup)

    J'ai donc un code de ce type :

    coté envoyeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    loup = new Loup(1,23,43,false,true);
    SDLNet_TCP_Send(sock, loup, sizeof(Loup));
    coté recepteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void * obj;
    SDLNet_TCP_Recv(client,obj,sizeof(Loup));                
    loup=(Loup*)obj;
    J'ai placé les fichiers loup.h et loup.cpp dans un repertoire commun au client et au server

    Pourtant j'ai un probleme : j'ai crée plusieurs petit projets pour tester ceci, dans certain cela marche et dans d'autres cela m'affiche des valeurs completement aléatoires ..

    Y' a un t'il un probleme lors du cast en loup* ?

    Y'a t'il quelque chose que j'ai oublié de faire ?

    Merci!

  2. #2
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    On peut voir la définition de ta classe Loup ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Absolument :

    Voila le .h

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    class Loup
    {
     
     public:
     
            Loup();
            Loup(int,int,int,bool,bool);
            ~Loup();
            void setId(int id);
            void setX(int xpos);
            void setY(int ypos);
            void setLoup(bool loup);
            void setGlace(bool glace);
            int getId();
            int getX();
            int getY();
            bool getLoup();
            bool getGlace();
     private:
            int id; 
            int x;
            int y;
            bool loup;
            bool glace;           
     
    };
    Et le .cpp :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
    #include "Loup.h"
     
    Loup::Loup()
    {
    }
     
    Loup::Loup(int idin,int xpos,int ypos,bool loupin,bool glacein)
    {              this->id=idin;
                   this->x=xpos;
                   this->y=ypos;
                   this->loup=loupin;
                   this->glace=glacein;
    }
     
    Loup::~Loup()
    {
    }
     
    void Loup::setId(int idin)
    {
                   this->id=idin;              
    }
     
    void Loup::setX(int xpos)
    {
                   this->x=xpos;              
    }
     
    void Loup::setY(int ypos)
    {
                   this->y=ypos;              
    }
     
    void Loup::setLoup(bool loup)
    {
                   this->loup=loup;              
    }
     
    void Loup::setGlace(bool glace)
    {
                   this->glace=glace;              
    }
     
    int Loup::getId()
    {
                return this->id;
    }
     
    int Loup::getX()
    {
                return this->x;
    }
     
    int Loup::getY()
    {
                return this->y;
    }
     
    bool Loup::getLoup()
    {
                return this->loup;
    }
     
    bool Loup::getGlace()
    {
                return this->glace;
    }
    En java y'a une interface Serializable mais la en c++ je suis perdu!

  4. #4
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Arf, je n'avais pas vu...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void * obj;
    SDLNet_TCP_Recv(client,obj,sizeof(Loup));
    La fonction va écrire un objet Loup à l'adresse pointée par obj, mais celle-ci n'est pas initialisée, ça va donc écrire n'importe où.

    Il faut donner l'adresse d'un Loup existant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Loup obj;
    SDLNet_TCP_Recv(client,&obj,sizeof(Loup));
    De plus si tu comptes avoir un programme portable, il faudra effectivement sérialiser tes instances plutôt que de les passer "brutalement" comme tu le fais.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Merci je teste ca et je te dis si ca marche !

    Sinon pour la serialization tu me conseille quoi comme librairie? boost?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Bon alors merci ca marche tres bien !

    J'en profite pour poser une autre question :

    Mon serveur est un simple programme avec une boucle infini qui ecoute ce qui arrive sur un certain port, analyse l'objet puis en renvoie un autre.

    Je crois que la methode SDLNet_TCP_Recv est bloquante.

    Pourquoi est ce que ce programme m'accapare 50% de mon processeur ? c'est pourtant une simple ecoute!

    edit : je viens de me rendre compte que la methode accept() n'est pas bloquante, c'est normal ??

  7. #7
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Sinon pour la serialization tu me conseille quoi comme librairie? boost?
    Par exemple, oui.

    Pour le reste... Désolé je n'ai jamais utilisé SDL_net

  8. #8
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Pour ton problème avec la méthode accept() non blocante, tu peux peut-être essayer d'utiliser SDLNet_CheckSockets ?

    PS : La "serialization", ça consistes en quoi ?

    Edit : oubliez le PS, j'ai recherché l'info sur le site...

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    je vais essayer cette methode pour voir ce que ca donne !

    sinon j'ai résolu le probleme en mettant un SDL_Delay(20) ou meme SDL_Delay(1000) , ca ne prend plus toutes les ressources mais moins de 1% du proc!

    Et aussi on m'a conseillé d'utiliser select/poll/epoll donc je vais aussi essayer ca!

  10. #10
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par phraides
    Et aussi on m'a conseillé d'utiliser select/poll/epoll donc je vais aussi essayer ca!
    Ca viens d'où ça ? C'est pas dans SDL_Net, si ?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    non c'est pas du SDL !

Discussions similaires

  1. Logins droppé avec un Transfert D'objets
    Par Pmatt dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/03/2007, 00h26
  2. Réponses: 3
    Dernier message: 08/09/2005, 10h45
  3. [ObjectOutputStream] Pb de transfert d'objets
    Par TylerKnoxx dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 02/11/2004, 13h53
  4. Réponses: 5
    Dernier message: 26/05/2004, 10h42
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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