为了账号安全,请及时绑定邮箱和手机立即绑定

如图所示,要怎么样把循环接收的所有数据都追加到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 关注
  • 207 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信