2 回答

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++;
}

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;
}
添加回答
舉報(bào)