c - RECV 动态内存分配

标签 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;
}

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

最佳答案

代码中的一些严重错误:

c == recv(...

== 是比较,而不是赋值,您将得到 01。然后:

tmp = realloc(buffer, i * sizeof(char));

sizeof(char) 根据定义为 1,并且您必须检查返回值是否为 NULL。另外,为您的变量命名一些有意义的名称 - 以后会为您省去很多麻烦。

现在,您正在尝试执行“后分配”之类的操作 - 读入缓冲区,然后将其扩展到您刚刚获得的大小 - 有点向后。

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

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

在大多数情况下都有效TM。如果对方不断向您提供数据,您可能需要添加一些健全性检查,以免耗尽您的所有内存。

希望这有帮助。

关于c - RECV 动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972157/

相关文章:

c - 动态函数名称 - 无法解析外部符号

c - 我将如何确保这两个矩阵具有非零、正的行和列值?

c - 为什么 write() 终止我的线程?

python - Python 中的套接字编程

c - 如何向另一台电脑发送通知?

c - 为什么我收到 "Segmentation fault: 11"

c - 如何调试 TCP recv()

xml - 替换 XML 文件中的动态内容

sql - TSQL 在动态 sql 的 where 子句中使用通配符

Oracle SQL查询: pivot table with dynamicly filled for in (advanced)