我想从套接字中保留动态内存。响应的大小是可变的,所以我想使用realloc来分配适当的内存大小。
这是负责处理它的代码片段:
char *ptr = (char*)calloc(sizeof(char),1024);
char *ptr2 = (char*)calloc(sizeof(char),1024);
//printf("aaaaaaa %p bbbbbbbb",ptr);
int nDataLength;
int i = 0;
while ((nDataLength = recv(Socket, ptr, 1024, 0)) > 0){
if (i > 0){//prepare in case that the response is bigger than 1024 bytes
printf("Data len: %d\n", nDataLength);
printf("%p points toa %d len: %d\n", ptr, *ptr, ((1024 * i) + nDataLength));
ptr2 = (char*)realloc(ptr2,((1024*i)+nDataLength));
printf("%p pints toa %d\n", ptr2, *ptr2);
system("pause");
memcpy(ptr2, ptr, nDataLength);
}
memcpy(ptr2, ptr, nDataLength);
i++;
}
问题是我从套接字收到的缓冲区总是被memcpy到同一个地址,所以我覆盖了以前的缓冲区。如何将ptr2移动到不覆盖先前的存储缓冲区?它必须是像:
memcpy(ptr2+((1024 * i), ptr, nDataLength);
但它不起作用。
谢谢
答案 0 :(得分:2)
首先:
calloc()
in C. Or malloc()
。sizeof (char)
来"缩放"分配,它总是只有1,所以它毫无意义。calloc()
进入内存,则无需使用recv()
。您的问题是,您不断传递recv()
增长缓冲区的开始,而不是下一个空闲位置。您应该使用put + nTotalLength
作为recv()
的目标,然后在每次成功接收后执行nTotalLength += nDataLength
。
答案 1 :(得分:2)
& ptr [1024]给出ptr结束后的地址。你只有2个水桶。在向其添加更多数据之前需要使用。如果它是基于TCP套接字的协议(或任何基于流的),您只需要读取标头,标头应该有数据大小的指示。对于该大小的malloc,使用数据,然后读取下一个标题。