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

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

如圖所示,要怎么樣把循環(huán)接收的所有數(shù)據(jù)都追加到data?

如圖所示,要怎么樣把循環(huán)接收的所有數(shù)據(jù)都追加到data?

定義函數(shù): void *memcpy(void *dest, const void *src, size_t n)函數(shù)說(shuō)明: memcpy()用來(lái)拷貝src所指的內(nèi)存內(nèi)容前n個(gè)字節(jié)到dest所指的內(nèi)存地址上。有個(gè)疑問(wèn),如果memcpy()調(diào)用2次,那么第二次拷貝的內(nèi)容是追加的還是覆蓋的?=========================================我用socket傳文件,socket緩沖區(qū)是有大小限制的,假設(shè)緩沖區(qū)是1K,那么調(diào)用sockClient.Receive(data, 1M)也只能收到前1K數(shù)據(jù)。接收的時(shí)候用循環(huán)......int dataLength;// 要接收文件的長(zhǎng)度sockClient.Receive(&dataLength, 4);// 接收文件的長(zhǎng)度信息byte *data = new byte[dataLength];//存放接收的文件....while (1){byte *t= new byte[0x1000];//循環(huán)一次接收的數(shù)據(jù)int n = sockClient.Receive(t, 0x1000);if (n == 0){break; //接收完畢退出}memcpy(data, t, n);//把收到的數(shù)據(jù)寫(xiě)入data}這樣為什么不行,哪里出問(wèn)題?要怎么樣把循環(huán)接收的所有數(shù)據(jù)都追加到data?發(fā)送小的圖片沒(méi)問(wèn)題,大的圖片就出問(wèn)題,如圖,而且接收程序出錯(cuò)退出,什么原因呢?給data分配的存儲(chǔ)空間不夠嗎?現(xiàn)在data的大小已經(jīng)是和發(fā)送的文件大小一致的了,奇怪了
查看完整描述

2 回答

?
MYYA

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

void *memcpy(void *dest, const void *src, size_t n);
就是把以src指向地址為起始地址連續(xù)n個(gè)字節(jié)的數(shù)據(jù)復(fù)制到dest指向地址為起始地址連續(xù)n個(gè)字節(jié)的空間內(nèi)。

如果連續(xù)調(diào)用memcpy但dest參數(shù)指向的地址不變的話,那當(dāng)然就是覆蓋數(shù)據(jù)了。
如果好追加數(shù)據(jù),那么每次執(zhí)行memcpy后要把dest的地址增加到你要追加數(shù)據(jù)的地址。

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

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



查看完整回答
反對(duì) 回復(fù) 2022-03-23
?
拉丁的傳說(shuō)

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

memcpy(data, t, n);//把收到的數(shù)據(jù)寫(xiě)入data
這行有問(wèn)題,應(yīng)該先定義一個(gè)接受長(zhǎng)度變量:
int nHaveReceive = 0;(定義在while前)

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

另外你定義了一個(gè):
byte *t= new byte[0x1000];//循環(huán)一次接收的數(shù)據(jù)
來(lái)放置一次接受的字符串,t并沒(méi)有釋放,這樣是很不規(guī)范的,也完全沒(méi)有必要,我給你寫(xiě)個(gè)最簡(jiǎn)單的代碼吧:

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



查看完整回答
反對(duì) 回復(fù) 2022-03-23
  • 2 回答
  • 0 關(guān)注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報(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)