Structur in char kopieren



  • Hey Leute,ich möchte gerne,um was zu übertragen eine kleine structur in einen char buffer copieren,damit ich das dan senden kann und mithilfe der structur wieder zurück convertieren kann.

    ich hab es mit memcpy versucht,jedoch zeigt es mir an ,dass es 0 Bytes gesendet hat.

    Player a;
    a.Name = "Stani";
    a.x = 1.3;
    a.y = 5.4;
    a.z = 12.3;
    
    char buf[1024];
    
    .......
    
    memcpy(&buf,&a,sizeof(Player));
    

    Was kann man da machen?
    Danke



  • Falsches Forum: C++ oder gar C wäre korrekt. Hier ist C++/CLI, eine .NET Sprache.

    Unter der Annahme, dass Du send(..) aus der Socket API benutzen möchtest:
    Du kannst nur POD Typen "direkt" senden, wobei direkt heisst, dass Du gerade die C/C++ Repräsentation des Objekts im Speicher benutzt. Das hat seine Limitationen und Probleme und schnell wirst Du an den Punkt kommen wo Du ein "richtiger" Serialisierungsmechanismus benötigst (von selbstgemacht über Boost.Serialization hinzu Google Protocol Buffers).

    Aber bleiben wir beim POD:
    Wenn das Player struct also übers Netz soll, muss Player::Name ein char Array sein - kein Pointer wie man aus dem gezeigten Code vermuten könnte. Dann müsste der Name z.B. mit strcpy(..) in Player::Name kopiert werden (und nicht einfach zugewiesen werden). Pointer zu übermitteln macht keinen Sinn, da sie ausserhalb des Prozesses nicht mehr gültig sind. Die Daten wo der Pointer hinzeigt sind ja nicht im Objekt enthalten und werden somit auch nicht übermittelt.

    Angenommen das Problem mit Player::Name wäre korrigiert:
    Es ist nicht nötig dein Objekt extra in ein char Buffer zu kopieren. Machs z.B. so:

    Player p = {};
    // setup p
    
    int bytesSent = send(theSocket, reinterpret_cast<const char*>(&p), sizeof(p), 0);
    

    MSDN send(..) Doku: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740149.aspx



  • Vielen Dank.
    Ich hab einfach als Type für Name einen string genommen,klappt sehr gut damit.
    Empfangen geht damit auch;D



  • Falls Du std::string meinst liegst Du falsch. std::string ist kein POD und desshalb ist es Zufall, falls es damit trotzdem geht - vermutlich wenn die Small String Optimization greift...


Log in to reply