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

Boost C++ Discussion :

Echange d'objets avec Boost ASIO


Sujet :

Boost C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Points : 48
    Points
    48
    Par défaut Echange d'objets avec Boost ASIO
    Bonjour,

    Je suis entrain de développer un client et un serveur en C++. Le client et le serveur communique par socket TCP.
    Pour cela, j'utilise la librairie Boost et je me suis inspiré de ce très bon tutoriel : http://gwenael-dunand.developpez.com...pp/boost/asio/.
    Pour résumer, dans ce tutoriel, on sérialise un objet (par exemple ChatMessage) et on envoit au serveur cette objet sérialisé pour qu'il puisse le déserialiser. La classe tcp_connection utilise un template pour envoyer/recevoir des paquets afin d'avoir des fonctions génériques.
    Voici le prototype de ces 2 méthodes de la classe tcp_connection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <typename T, typename Handler>
    	void async_write(const T& t, Handler handler);
     
    template <typename T, typename Handler>
    void async_read(T& t, Handler handler);
    Mais actuellement, si le client envoie un objet de classe A, il recevra de la part du serveur que des objets de classe A. Car c'est le client qui met en paramètre de la méthode async_read une référence vers un objet de classe A.

    J'aimerai donc que le client envoie un objet de classe A et il recevra de la part du serveur un objet de classe A ou de classe B.

    J'ai pensé à ajouter dans le header des paquets envoyés le nom de classe sérialisée. Mais, cela ne règle qu'une partie du problème, car je ne vois comment renvoyer une référence vers objet de classe A ou de classe B (peut-être une classe abstraite, dont hérite la classe A et la classe B?).

    J'aimerai donc avoir un avis sur les solutions qui s'offrent à moi.

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Salut,

    L'héritage est une bonne idée avec une classe de base (ex: Base).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct generic_message
    {
        template<class Archive>
        void serialize(Archive & ar, const unsigned int version)
       {
            ar & m_param;
            m_object->serialize(ar, version);
        }
     
        Base* m_object;
        int      m_param;
    };
    Avec A et B qui dérive de Base et qui implémentent la sérialisation...
    Sinon tu as aussi la possibilité de le faire directement : http://www.boost.org/doc/libs/1_53_0...doc/index.html. Mais c'est moins bien à vue de nez.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Points : 48
    Points
    48
    Par défaut
    merci poukill pour ta réponse.

    Mais, je suis parti vers une autre direction. En effet, j'ai contourné le problème en fournissant à la classe TcpConnection la classe déjà sérialisée avec son nom.

    Je ne sais pas si esthétiquement c'est plus propre (ou même plus optimisé) de passer par un objet de base que passer directement la classe sérialisée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Asynchronisme avec boost::asio
    Par Khan34 dans le forum C++
    Réponses: 4
    Dernier message: 05/10/2013, 15h35
  2. [BOOST.ASIO] Pb avec deadline_timer
    Par vdaanen dans le forum Boost
    Réponses: 1
    Dernier message: 31/08/2011, 12h22
  3. Impossible de compiler avec BOOST ASIO
    Par Sentenza31 dans le forum Débuter
    Réponses: 0
    Dernier message: 27/11/2010, 18h52
  4. Manipulation d'objets socket avec boost::asio
    Par K-you dans le forum Boost
    Réponses: 9
    Dernier message: 14/04/2010, 14h40
  5. Envoi de données entières avec boost::asio
    Par K-you dans le forum Boost
    Réponses: 5
    Dernier message: 28/03/2010, 09h07

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