3 回答

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是一個(gè)非常糟糕的主意。二進(jìn)制數(shù)據(jù)應(yīng)始終以下列方式發(fā)送:
處理不同的字節(jié)順序
處理不同的填充
處理內(nèi)在類型的字節(jié)大小的差異
不要以二進(jìn)制方式編寫整個(gè)結(jié)構(gòu),而不是文件,而不是套接字。
始終分別編寫每個(gè)字段,并以相同的方式讀取它們。
你需要有像這樣的功能
unsigned char * serialize_int(unsigned char *buffer, int value){ /* Write big-endian int value into buffer; assumes 32-bit int and 8-bit char. */ buffer[0] = value >> 24; buffer[1] = value >> 16; buffer[2] = value >> 8; buffer[3] = value; return buffer + 4;}unsigned char * serialize_char(unsigned char *buffer, char value){ buffer[0] = value; return buffer + 1;}unsigned char * serialize_temp(unsigned char *buffer, struct temp *value){ buffer = serialize_int(buffer, value->a); buffer = serialize_char(buffer, value->b); return buffer;}unsigned char * deserialize_int(unsigned char *buffer, int *value);
或者等效,當(dāng)然有幾種方法可以設(shè)置緩沖區(qū)管理等等。然后,您需要執(zhí)行序列化/反序列化整個(gè)結(jié)構(gòu)的更高級(jí)函數(shù)。
這假設(shè)序列化是從緩沖區(qū)完成的,這意味著序列化不需要知道最終目標(biāo)是文件還是套接字。它還意味著您需要支付一些內(nèi)存開銷,但出于性能原因,它通常是一個(gè)很好的設(shè)計(jì)(您不希望對(duì)套接字執(zhí)行每個(gè)值的write())。
完成上述操作后,您可以通過以下方式序列化和傳輸結(jié)構(gòu)實(shí)例:
int send_temp(int socket, const struct sockaddr *dest, socklen_t dlen, const struct temp *temp){ unsigned char buffer[32], *ptr; ptr = serialize_temp(buffer, temp); return sendto(socket, buffer, ptr - buffer, 0, dest, dlen) == ptr - buffer;}
關(guān)于上述幾點(diǎn)需要注意:
要發(fā)送的結(jié)構(gòu)首先按字段順序序列化為
buffer
。序列化例程返回一個(gè)指向緩沖區(qū)中下一個(gè)空閑字節(jié)的指針,我們用它來(lái)計(jì)算它序列化的字節(jié)數(shù)
顯然,我的示例序列化例程不能防止緩沖區(qū)溢出。
如果
sendto()
調(diào)用成功,則返回值為1 ,否則為0。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
使用'pragma'包選項(xiàng)確實(shí)解決了我的問題,但我不確定它是否有任何依賴?
#pragma pack(1) // this helps to pack the struct to 5-bytesstruct packet {int i;char j;};#pragma pack(0) // turn packing off
然后下面的代碼行沒有任何問題
n = sendto(sock,&pkt,sizeof(struct packet),0,&server,length);n = recvfrom(sock, &pkt, sizeof(struct packet), 0, (struct sockaddr *)&from, &fromlen);

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
有沒有必要寫自己的序列化程序short
和long
整數(shù)類型-使用htons()
/ htonl()
POSIX功能。
- 3 回答
- 0 關(guān)注
- 481 瀏覽
添加回答
舉報(bào)