2017-01-23 40 views
1
struct packet_format { 
    uint32_t field_a; 
    uint8_t field_b; 
    uint16_t field_c; 
    uint32_t field_d; 
    uint16_t field_e; 
    uint8_t field_f; 
}; 

uint32_t size_of_packet = 14; 
uint8_t *data_to_transmit = malloc(size_of_packet); 
struct packet_format *s = (struct packet_format *)data; 

s->field_a = 1; 
s->field_b = 2; 
s->field_c = 3; 
s->field_d = 4; 
s->field_e = 5; 
s->field_f = 6; 

sendto(... data_to_transmit, size_of_packet ...) 

由於結構填充,傳輸的數據(data_to_transmit)不能保證是正確的(以聲明的結構格式),對嗎?那麼,以正確的格式將數據放入data_to_transmit的最佳方式是什麼?我需要將結構中的每個字段隔開嗎?使用套接字傳輸數據時避免結構填充的最佳方法是什麼?

編輯:在標題稍有不慎

+0

手動複製(memcpy等)可能是確保完全控制傳輸的最佳方法。 –

+0

只需單獨發送結構內容,在接收端分別讀取它們並將它們放回結構中。所以即使在接收端,結構不同也可以工作。 –

+0

分別發送每個成員 – zoska

回答

2

搜索編譯器編譯指示,也許它有一個選項,以避免填充。

但是這在其他編譯器上不兼容。

做到這一點「難」是不可避免的。對於每種數據類型,創建一個從數據構建數據包的函數,以及一個將數據包解析爲數據結構的相反函數。這裏沒有捷徑。

相關問題