【问题标题】:Dynamic memory allocation for socket C套接字 C 的动态内存分配
【发布时间】:2014-05-16 08:04:33
【问题描述】:

我想从套接字中保留动态内存。响应的大小是可变的,所以我想使用 realloc 来分配适当的内存大小。

这是处理它的代码 sn-p:

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

问题是我从套接字接收的缓冲区总是被 memcpyed 到同一个地址,所以我覆盖了以前的缓冲区。如何移动 ptr2 以不覆盖以前的存储缓冲区?它必须是这样的:

memcpy(ptr2+((1024 * i), ptr, nDataLength); 但它不起作用。

谢谢

【问题讨论】:

  • 我觉得它应该可以工作,没有任何问题。你能把整个代码贴出来吗?

标签: c sockets memory-management malloc realloc


【解决方案1】:

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

【讨论】:

  • 实际上读取标头要好得多,因为我可以只为整个数据包保留一次内存。如何读取尺寸标题?谢谢
  • 我刚刚意识到标头给你的是碎片消息的大小,而不是完整数据包的大小。所以在那种情况下这是没用的
【解决方案2】:

第一:

  1. Please don't cast the return value of calloc() in C. Or malloc()
  2. 不要使用 sizeof (char) 来“缩放”分配,它总是只有 1,所以没有意义。
  3. 无论如何,如果您要将recv() 放入内存,则无需使用calloc()

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

【讨论】:

  • 1- 如果我在 calloc 之前删除 (char*) 我会收到此错误:cannot convert from 'void *' to 'char *' 2- 我使用它来独立于编译器,因为 char en c 的长度与 c++ 中的不同3-我想我需要为要接收的缓冲区保留一些内存,对吗? 4-可以按照你说的方式或我的方式来完成。一样的。问题是我不知道如何将值(1024)与指针相加。我该怎么做?谢谢!!!
  • 我没有意识到你想同时用 C 和 C++ 编程。如果我有,我不会回答。 :) (您的标签显示为“C”)。
  • 没问题。但是,我怎样才能将一个地址与一个值相加呢?那么calloc返回的地址和1024之类的值呢?谢谢
  • put + nTotalLength 将偏移量(整数值)添加到指针。
猜你喜欢
  • 1970-01-01
  • 2015-12-07
  • 2015-06-27
  • 2021-02-28
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2018-01-29
相关资源
最近更新 更多