2 回答

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

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;
}
添加回答
舉報