第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

通過C中的套接字傳遞結(jié)構(gòu)

通過C中的套接字傳遞結(jié)構(gòu)

C
眼眸繁星 2019-07-26 15:47:32
通過C中的套接字傳遞結(jié)構(gòu)我試圖將整個(gè)結(jié)構(gòu)從客戶端傳遞到服務(wù)器,反之亦然。讓我們假設(shè)我的結(jié)構(gòu)如下struct temp {   int a;   char b;}我使用sendto并發(fā)送結(jié)構(gòu)變量的地址,并使用recvfrom函數(shù)在另一側(cè)接收它。但我無(wú)法獲得接收端發(fā)送的原始數(shù)據(jù)。在sendto函數(shù)中,我將接收到的數(shù)據(jù)保存到struct temp類型的變量中。n = sendto(sock, &pkt, sizeof(struct temp), 0, &server, length);n = recvfrom(sock, &pkt, sizeof(struct temp), 0, (struct sockaddr *)&from,&fromlen);其中pkt是struct temp類型的變量。雖然我收到8字節(jié)的數(shù)據(jù),但如果我嘗試打印它只是顯示垃圾值。任何幫助修復(fù)它?注意: 不得使用第三方庫(kù)。編輯1:我對(duì)這個(gè)序列化概念真的很陌生。但是如果不進(jìn)行序列化,我不能通過套接字發(fā)送結(jié)構(gòu)?EDIT2:當(dāng)我嘗試使用sendto和recvfrom函數(shù)發(fā)送字符串或整數(shù)變量時(shí),我在接收端正確接收數(shù)據(jù)。為什么不在結(jié)構(gòu)的情況下?如果我不必使用序列化功能,那么我應(yīng)該單獨(dú)發(fā)送每個(gè)結(jié)構(gòu)的成員嗎?這實(shí)際上不是一個(gè)合適的解決方案,因?yàn)槿绻?#39;n'個(gè)成員,那么只有添加'n'個(gè)代碼行才能發(fā)送或接收數(shù)據(jù)。
查看完整描述

3 回答

?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊

這是一個(gè)非常糟糕的主意。二進(jìn)制數(shù)據(jù)應(yīng)始終以下列方式發(fā)送:

不要以二進(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。


查看完整回答
反對(duì) 回復(fù) 2019-07-26
?
吃雞游戲

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);


查看完整回答
反對(duì) 回復(fù) 2019-07-26
?
慕的地10843

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊

有沒有必要寫自己的序列化程序shortlong整數(shù)類型-使用htons()htonl()POSIX功能。


查看完整回答
反對(duì) 回復(fù) 2019-07-26
  • 3 回答
  • 0 關(guān)注
  • 481 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)