wxSocketBase Read / Write



  • phlox81 schrieb:

    Das Würde nur gehen, wenn das Struct nur aus POD Elementen bestehen würde.
    Dürfte also kein Selbstdefinierter Datentyp enthalten sein.

    Warum geht das nur dann?

    Würde es so gehen?

    SocketOutputStream->Write(&header, sizeof(header));
    

    Welche buffer varianten könnte ich den nehmen?


  • Mod

    Mitbewohner schrieb:

    phlox81 schrieb:

    Das Würde nur gehen, wenn das Struct nur aus POD Elementen bestehen würde.
    Dürfte also kein Selbstdefinierter Datentyp enthalten sein.

    Warum geht das nur dann?

    Weil nur dann das struct einen festes binäres Speicherabbild hat.

    struct a{int x,y;}// ist immer 2*sizeof(int) groß
    struct b{int x,y; std::string name;}; // string ist kein pod, hat also eine dynamische/variable größe im Speicher
    

    Würde es so gehen?

    SocketOutputStream->Write(&header, sizeof(header));
    

    a könntest du mit Write so wegschreiben, b nicht.

    Welche buffer varianten könnte ich den nehmen?

    Du müsstest den Inhalt des structs in einen Stream oder String schreiben. Und dann den Buffer des Streams über den Socket senden.
    Du musst nur dafür sorgen, das die Daten eine feste formatierte binäre form haben, welche du in ein void* umwandeln kannst.

    phlox



  • Vielen dank bis dahin! 👍



  • Wie bekomme ich den ein struct in einen string?



  • Meine struct sieht so aus

    struct Header{
       unsigned long dateigroesse;
       wxString ueDatei;
    };
    

    unsigned long hat doch ne feste Größe und wxstring auch...
    Obwohl ich mir bei wxstring nicht sicher bin, aber das könnte man ja in std::string konveritieren, der doch die feste größe von 4 byte hat!?!?!

    Dan ist die Größe der struct immer gleich und man könnte es übertragen?!


  • Mod

    wxString small = "foo";
    wxString big = "this is a really big and long string";
    

    Beide sind 4 Byte groß? 😉

    Du müsstest den Inhalt des Structs in ein binär format bringen.
    z.b:

    wxString buffer;
    Header h;
    buffer << h.dateigroesse << ' ';
    buffer << h.ueDatei.GetLength() << ' ';
    buffer << h.ueDatei.fn_str() << ' ';
    

    Danach hast du den inhalt des Structs in buffer und kannst ihn versenden.



  • Wie kommst Du darauf das ein String eine feste Größe von 4 byte hat? Ein einzelnes Zeichen belegt 1 byte. Also ist der String auch auch mindestens so groß wie er Zeichen hat



  • Ich hatte ein bisschen rumprobiert und sizeof(string) ergab immer 4, egal welcher Inhalt der String hatte...


  • Mod

    Mitebwohner schrieb:

    Ich hatte ein bisschen rumprobiert und sizeof(string) ergab immer 4, egal welcher Inhalt der String hatte...

    Was garantiert immer falsch ist. sizeof funktioniert i.d.R. nur für POD Typen korrekt. Eine Klasse wie wxString oder std::string ist aber kein POD.



  • Der Datentyp string wird intern einen Zeiger auf die tatsächliche Stringkonstante haben.
    Daher bleibt der Wert von sizeof(string) zwar gleich, allerdings ist dort der eigentliche Inhalt nicht berücksichtigt.


Anmelden zum Antworten