2016-12-28 4 views
2

Suche im ganzen Web nach Möglichkeiten, Daten in C serialisieren, so dass ich eine Struktur über einen TCP/IP-Socket senden konnte, konnte ich nichts Einfaches finden. Aber ich denke, auf diese Weise können Sie die Positionen der Bits in einem Paket fixieren und so "de facto" serialisieren.Serialisierung in C mit malloc

packet *datapkt = NULL; 
datapkt = (packet*)malloc(PKT_SIZE); // Allocation of memory with this size 
datapkt->field = data; 
...... 
send(datapkt); 
free(datapkt); 

Kann mir jemand sagen, ob das eine gute Idee ist? Bis jetzt funktioniert es in meinem Projekt.

Vielen Dank im Voraus!

+2

Es gibt eine Wäscheliste mit Gründen, Vorsicht walten zu lassen, wenn man Strukturen in Form eines Speicherlayouts über eine Leitung zu einem fremden Host, [endianness] (https://en.wikipedia.org/wiki/Endianess) und der Plattform verschiebt. padding and packing] (http://stackoverflow.com/questions/4306186/structure-padding-and-packing) in der Nähe der Spitze der Liste. Wenn das, was du machst, "funktioniert", stelle sicher, dass es so ist, und nicht zufällig. – WhozCraig

Antwort

0

Wenn dies zu tun, Sie haben zwei Dinge zu beachten:

1. Endianness 
2. Compiler padding 

Der erste Punkt werden die Daten übernehmen andere Form machen je nach endianness Ihres Systems. Dies ist ein Problem für Typen, die größer als ein Byte sind.

Für den zweiten Punkt müssen Sie sicherstellen, dass der Compiler keine Bytes zwischen den Mitgliedern in Ihrer Struktur hinzufügt. Dies kann mit Compiler-Pragmas geschehen.

0

Ihr Ansatz weist einen schwerwiegenden Fehler auf. Sie haben keinen Einfluss auf das Speicherlayout Ihrer Struktur. Der Compiler fügt möglicherweise Padding-Bytes zwischen Struc-Mitgliedern hinzu. Wenn Sie an beiden Enden der Verbindung verschiedene Compiler und CPUs haben, schlägt Ihr Ansatz mit einer einfachen Struktur fehl. Ganz zu schweigen von der unterschiedlichen Endlichkeit auf unterschiedlicher Hardware.

Daher ist es keine gute Idee.

0

Verwenden von Structs für die Serialisierung über lokale Inter-Thread/Prozess-Kommunikation ist in Ordnung unter gleichen Compiler und Compiling Flags. Aber ist keine gute Idee für die Netzwerkkommunikation. Clients im Netzwerk haben möglicherweise einen anderen CPU-Bogen oder ein anderes Betriebssystem und es gibt keine Garantie, dass die Speicherzuweisung für Strukturelemente auf verschiedenen Computern konstant ist. Beispiel: sizeof (int) kann sich in X86 und X86_64 oder anderen Architekturen/Compilern unterscheiden. Das Speicherlayout wird vom Compiler definiert und kann auf verschiedenen Rechnern variieren, sogar auf verschiedenen Betriebssystemen, auch Paddings und Endiannes kommen hinzu und ändern auch das Speicherlayout.