2016-12-28 59 views
2

在C語言中搜索所有網頁以序列化C中的數據,所以我可以通過TCP/IP套接字發送一個結構體,但是我找不到任何簡單的東西。但我認爲這樣,你可以修復數據包中位的位置,從而「事實上」序列化它。使用malloc進行C語言序列化

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

誰能告訴我這是個好主意嗎?到目前爲止,它在我的項目中工作。

在此先感謝!

+2

當將內存佈局表格中的結構推送到外部主機,[endianness](https://en.wikipedia.org/wiki/Endianness)和平臺[填充和包裝](http://stackoverflow.com/questions/4306186/structure-padding-and-packing)在列表的頂部附近。如果你正在做的是「正在工作」,確保它是按照設計進行的,而不是偶然的。 – WhozCraig

回答

0

做這件事時,你必須考慮兩件事情:

1. Endianness 
2. Compiler padding 

第一點將使取決於你的系統的字節序的數據採取不同的形式。對於大於一個字節的類型,這是一個問題。

對於第二點,您需要確保編譯器不在結構中的成員之間添加任何字節。這可以通過編譯器編譯指示來完成。

0

您的方法存在嚴重缺陷。 您對結構的內存佈局沒有影響。編譯器可能會在struc成員之間添加填充字節。如果在連接的兩端都有不同的編譯器和CPU,則使用簡單結構的方法將失敗。更不用說在不同硬件上的不同永久性。

因此,這不是一個好主意。

0

在相同的編譯器和編譯標誌下,通過本地線程/進程通信使用串行化結構是可以的。 但是對網絡通信來說不是個好主意。網絡上的客戶端可能具有不同的CPU架構或操作系統,並且不能保證結構成員的內存分配在不同的機器上將保持不變,例如sizeof(int)在X86和X86_64或其他體系結構/編譯器中可能會有所不同。存儲器佈局由編譯器定義,並且可能在不同的機器上有所不同,甚至不同的操作系統也會有不同,填充和端口也會進入並更改存儲器佈局。