Problem mit einen char array das übers Netzwerk verschickt wird...



  • Hallo, ich habe ein paar Funktionen geschrieben um Daten einfach übers Netzwerk auszutauschen ... folgendes Problem ich kopier den inhalt eines std::string mit strcpy in ein char array von 1024 bytes (keine sorge der string hat platz genug)
    wenn ich nun meiner funktion eine datengröße von 48 übergebe

    struct Buffer
    {
        unsigned short u_shSize;
        char szString[1022];
    };
    
    // sizeof(Buffer) = 1024...
    

    , und gebe das char array dann bei der anderen seite aus, hängt am ende des textes eine 0 ... also es werden bei 48 bytes ein short wert übergeben und die ersten 46 zeichen des char array.... wenn ich mir dann auf der gegen seite die größe des strings anzeigen lasse kommt 47 ... da stehe ich echt vor einem rätsel... ich weiß nicht ob hier an dieser stelle der quellcode viel bringt da dieses problem NUR bei der Größe 48 auftriitt wenn ich 47 oder 49 übergebe kommt das problem nicht... habt ihr eine IDEE ?!

    Gruß Chris



  • Hi,

    ehrlich gesagt, habe ich Dein Problem nicht ganz verstanden. Hast Du ein Problem damit, dass strcpy() automatisch "0-Terminierung" macht (also hinter das letzte Zeichen eine 0 anhängt), dann verwende stattdessen memcpy().

    Noch ein Tipp: "unsigned shorts" haben nicht auf allen Plattformen (OS, Compiler, ...) dieselbe Größe. Das gilt ebenso für structs überhaupt: Da kann jeder Compiler padden (= Füllbytes einfügen), was er mag.
    Wenn Du wirklich unabhängig sein willst, musst Du alles in chars mit fest definierten Längen kopieren.

    Gruß,

    Simon2.



  • hmm wenn du sagst ich soll alles in chars "übertragen", dann gehe ich davon das chars auf ALLEN platformen immer 1 BYTE groß sind ?



  • Foxx90 schrieb:

    hmm wenn du sagst ich soll alles in chars "übertragen", dann gehe ich davon das chars auf ALLEN platformen immer 1 BYTE groß sind ?

    Japp - allerdings ist das keine besonders mutige Vermutung.
    Wenn ich mich recht entsinne, ist das im C++-Standard implizit festgelegt ("sizeof(char) == 1" && "sizeof liefert die Anzahl der Bytes, die ein Datentyp belegt").

    Gruß,

    Simon2.


Anmelden zum Antworten