RECV动态内存分配

时间:2012-08-15 15:19:20

标签: c sockets dynamic recv

在C中,我希望阅读页面的html,但我希望保存数据的缓冲区是动态的。我知道我必须通过循环和realloc的使用来做到这一点,但我不太确定我会怎么做。假设我的套接字(sock)已经打开,请考虑以下内容:

char *buffer = ???, *tmp;  //just my guess I'm fairly certain buffer cannot be NULL considering my recv loop...
int q = 0, c;
int i = 1;       //buffer size

    while(q < i)
{
    c == recv(sock, buffer + q, i - q, 0);
    if(c == SOCKET_ERROR) break;
    i += c;
    tmp = realloc(buffer, i * sizeof(char));
    //if(!tmp) /*not important right now I can add error handling later*/;
    buffer = tmp;      
    q += c;
}

这是我对如何实现目标的最好猜测,但我非常怀疑这会有效,我只需要一些见解或纠正。

1 个答案:

答案 0 :(得分:4)

代码中的一些错误:

c == recv(...

==是一种比较,而非作业,您将获得01。然后:

tmp = realloc(buffer, i * sizeof(char));
根据定义,

sizeof(char)1,您必须检查NULL的返回值。另外,将变量命名为有意义的东西 - 以后会给你带来很多悲伤。

现在,你正在尝试做一些类似“post-allocation”的事情 - 读入缓冲区,然后将其扩展到你刚刚获得的大小 - 倒退。

简单解决方案(众多之一):

  • 预先分配缓冲区,
  • 在循环中读取它,跟踪累积的大小(以及偏移量),
  • 如果您的缓冲空间不足 - 将其重新分配到前一个的两倍,然后继续。

这个大部分时间都在工作 TM 。如果对方继续为您提供数据,您可能需要添加一些健全性检查,而不是吞噬所有记忆。

希望这有帮助。