繁体   English   中英

套接字C的动态内存分配

[英]Dynamic memory allocation for socket C

我想从套接字中保留动态内存。 响应的大小是可变的,所以我想使用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);但它不起作用。

谢谢

第一:

  1. 请不要在C.或malloc()calloc()的返回值
  2. 不要使用sizeof (char)来“缩放”分配,它总是只有1,所以它毫无意义。
  3. 如果你要将recv()放入内存中,则无需使用calloc()

你的问题是你不断传递recv()你的增长缓冲区的开始 ,而不是下一个存储的空闲位置 您应该put + nTotalLength作为recv()的目标,然后在每次成功接收后执行nTotalLength += nDataLength

&ptr [1024]给出ptr结束后的地址。 你只有2个水桶。 在向其添加更多数据之前需要使用。 如果它是基于TCP套接字的协议(或任何基于流的),您只需要读取标头,标头应该有数据大小的指示。 对于该大小的malloc,使用数据然后去读取下一个标题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM