message und verschiedene payloads



  • Hallo zusammen,

    ich stehe gerade mal wieder ein wenig auf der Leitung und hoffe, dass ihr mich in die richtige Richtung schieben könnte.

    Ich habe eine Basisklasse für eine Payload, genannt PayloadBase. Diese wird durch ein Template erweitert zu Payloady<T>. Nun gibt es ganz viele Payloads, welche etwas sind wie:

    class EinePayload: public Payload<int>{}
    

    oder

    class EineAnderePayload: public Payload<bool>{}
    

    Nun will ich die Payloads in meine Nachricht packen, und habe es naiverweise so gemacht:

    class Nachricht{
    private:
       PayloadBase * payload;
    
    public:
    
      void setPayload(PayloadBase * sdu) {
        payload = sdu;
      }
    

    Nun scheint aber auf der Empfängerseite nicht mehr wirklich was anzukommen, also nur noch so eine verstümmelte Payload, statt EinePayload o.ä. . Kann mir jemand nen Tipp geben, wie ich es richtig mache? Wäre cool.

    Vielen Dank schon einmal im voraus.



  • achso,

    die Nachricht wird beim senden und empfangen automatisch serilisiert/deserialisiert. Das geht. Ich nehm einfach an, dass so wie ich die Payload an die Nachricht übergebe, ich das Objekt verstümmele. Wie mache ich es richtig?



  • Was heisst Senden/Empfangen? Was/wie/wo/wohin (de-)serialisierst du?

    Eine Objekthierarchie zu einem Bytehaufen oder einem String zu machen ist meistens recht einfach. Der umgekehrte Weg bedarf meistens einiger Tricks, damit du die richtigen Unterklassen zur richtigen Zeit wieder erzeugst und auch den Code sauber hälst.

    Aber im Grund hast du uns kaum Informationen gegeben.



  • sven_ schrieb:

    Wie mache ich es richtig?

    Indem du es nicht mehr falsch machst. Da du nicht zeigst, was du machst, kann man nicht weiter helfen.



  • Schreib einfach irgendwo virtual dran, das wird schon helfen. 🙄

    ps
    http://www.c-plusplus.net/forum/200753


  • Mod

    hustbaer schrieb:

    Schreib einfach irgendwo virtual dran, das wird schon helfen. 🙄

    ps
    http://www.c-plusplus.net/forum/200753

    = 0 ist auch zu empfehlen. Klingt ja irgendwie nach Slicing.



  • Hallo zusammen,

    also aktuelle sende und empfange ich im Simulator, also es werden die C++-Objekte versendet und empfangen, wenns übers Netz geht, ist eine Serialisation vorhanden. Daher benötige ich halt "nur" eine "Komposition" von Nachricht und Payload. Hier mal ein wenig mehr Code:

    class JoinAnnounce : public MulticastPayload<JoinAnnounce> {
    ...
    };
    
    template<typename MulticastPayloadType>
    class MulticastPayload : public MulticastPayloadBase {
    ...
    };
    
    class MulticastMessage: public Serializable {
            MulticastMessage::MulticastMessage(const MulticastPayloadBase & sdu)
            :...., payload(sdu.dup()){ //dup() erzeugt eine Kopie der SDU
            }
    protected:
      MulticastPayloadBase * payload;
    };
    

    Von den Schichten bekomme ich sowas wie nen JoinAnnounce, aktuell über folgenden Code:

    Transfer::sendMessage(const MulticastPayloadBase & sdu) {
    
                MulticastMessage msg(sdu);
    .....
    }
    


  • Ach so, dann ist es ganz klar:

    ........



  • Ich denke mal, mein MulticastPayloadBase * payload in der Klasse MulticastMessage ist falsch. Aber irgendwie steh ich auf dem Schlauch. Ich habe es schon mit:

    template<typename T>
    MulticastPayload<T> * payload;
    

    probiert, aber da kam ich leider auch nicht weiter. Wäre dies überhaupt nen Weg?



  • Achso,

    und ich will quasi von einem Rechner zu einem anderen Senden, wobei Layer n eine Payload generiert und diese an Layer n-1 (Transfer) weiter gibt, wo sie in die Multicast Nachricht verpackt wird. Dort wird sie versendet, und auf der Gegenseite von n-1 angenommen und die Payload an Layer n ausgeliefert. Aber ich packe sie wohl schon falsch im Transfer (Layer n-1) zusammen.

    Nun besser verständlich? 😞



  • Wenn ich folgendes Probiere in Layer n-1:

    Transfer::sendMessage(const MulticastPayloadBase & sdu) { 
    std::cout<< sdu <<"\n"; //geht, ergibt Type JoinAnnounce
                 MulticastMessage msg(sdu); 
    std::cout<< msg.getPayload()<<"\n"; //geht schon nicht
    }
    

    Kommt statt einer Ausgabe wie in der ersten Zeile halt nur ein Segfault.


Anmelden zum Antworten