亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如圖所示,要怎么樣把循環接收的所有數據都追加到data?

如圖所示,要怎么樣把循環接收的所有數據都追加到data?

慕尼黑8549860 2022-03-17 19:19:41
定義函數: void *memcpy(void *dest, const void *src, size_t n)函數說明: memcpy()用來拷貝src所指的內存內容前n個字節到dest所指的內存地址上。有個疑問,如果memcpy()調用2次,那么第二次拷貝的內容是追加的還是覆蓋的?=========================================我用socket傳文件,socket緩沖區是有大小限制的,假設緩沖區是1K,那么調用sockClient.Receive(data, 1M)也只能收到前1K數據。接收的時候用循環......int dataLength;// 要接收文件的長度sockClient.Receive(&dataLength, 4);// 接收文件的長度信息byte *data = new byte[dataLength];//存放接收的文件....while (1){byte *t= new byte[0x1000];//循環一次接收的數據int n = sockClient.Receive(t, 0x1000);if (n == 0){break; //接收完畢退出}memcpy(data, t, n);//把收到的數據寫入data}這樣為什么不行,哪里出問題?要怎么樣把循環接收的所有數據都追加到data?發送小的圖片沒問題,大的圖片就出問題,如圖,而且接收程序出錯退出,什么原因呢?給data分配的存儲空間不夠嗎?現在data的大小已經是和發送的文件大小一致的了,奇怪了
查看完整描述

2 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

void *memcpy(void *dest, const void *src, size_t n);
就是把以src指向地址為起始地址連續n個字節的數據復制到dest指向地址為起始地址連續n個字節的空間內。

如果連續調用memcpy但dest參數指向的地址不變的話,那當然就是覆蓋數據了。
如果好追加數據,那么每次執行memcpy后要把dest的地址增加到你要追加數據的地址。

你的代碼可以改為(請自己保證給data分配足夠的存儲空間):

int m=0;
while (1)
{
byte *t= new byte[0x1000];//循環一次接收的數據
int n = sockClient.Receive(t, 0x1000);
if (n == 0)
{
break; //接收完畢退出
}
memcpy(data+m*0x1000, t, n);//把收到的數據寫入data
m++;
}



查看完整回答
反對 回復 2022-03-23
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

memcpy(data, t, n);//把收到的數據寫入data
這行有問題,應該先定義一個接受長度變量:
int nHaveReceive = 0;(定義在while前)

下面再修改為:
memcpy(data+nHaveReceive, t, n);//把收到的數據寫入data
nHaveReceive += n;
這樣就可以了。

另外你定義了一個:
byte *t= new byte[0x1000];//循環一次接收的數據
來放置一次接受的字符串,t并沒有釋放,這樣是很不規范的,也完全沒有必要,我給你寫個最簡單的代碼吧:

int dataLength;// 要接收文件的長度
sockClient.Receive(&dataLength, 4);// 接收文件的長度信息
byte *data = new byte[dataLength];//存放接收的文件
....
byte*pbuffer = data;
while (1)
{
int n = sockClient.Receive(pbuffer,0x1000);
if (n == 0)
{
break; //接收完畢退出
}
pbuffer+= n;
}



查看完整回答
反對 回復 2022-03-23
  • 2 回答
  • 0 關注
  • 240 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號