c - 如何存储 recv() 的输出?

标签 c sockets dynamic recv

在 C 中我有工作代码但不知道它为什么工作,所以我开始重写它以便我能真正理解发生了什么。

到目前为止一切顺利!我重写了并且 90% 确定我理解现在发生的一切;然而,问题是我不知道如何将 recv (databff) 接收到的数据 block 存储到我的预分配缓冲区 (htmlbff).

考虑以下代码(请注意,我将其精简了很多,因此它仅包含基础知识,例如,没有内存重新分配或泄漏保护等...):

#define BUFFERSIZE 4096
#define MAXDATASIZE 256

char *htmlbff, databff[MAXDATASIZE];
int c, i = BUFFERSIZE, q = 0;          
if(!(htmlbff = malloc(i)))
{
    printf("\nError! Memory allocation failed!");
    return 0x00;
}
while((c = recv(sock, databff, MAXDATASIZE, 0)) > 0)
{
     /*memory checks stripped out since they are irrelevent for this post*/
     /*store data to the appropriate area in htmlbff*/
     q += c;           
}

所以(如果我这样做是正确的,并且事情如我所想的那样进行)c 是当前数据 block 的大小,q 是到目前为止接收到的数据总量(q 每次循环重复时递增 c)。目前我正在使用 q 进行内存处理(以防万一有人想知道),但我相信它在解决这个问题方面也有一定的意义。

无论如何,我要问的问题是关于第二条评论的。如何将 recv 中的数据正确存储到 htmlbff 中?

最佳答案

使用memcpy()将数据复制(附加)到 htmlbff,但您还需要确保不超过 htmlbff 的大小。在接收到 BUFFERSIZE 字节时停止接收数据或使用 realloc()扩展 htmlbff 以包含更多数据。

例如:

char* htmlbff;
size_t htmlbff_size = BUFFERSIZE;
htmlbff = malloc(htmlbff_size);

if (htmlbff)
{
    while((c = recv(sock, databff, MAXDATASIZE, 0)) > 0)
    {
        if (c + q > htmlbff_size)
        {
            htmlbff_size *= 2; /* Arbitrary doubling of size. */
            char* tmp = realloc(htmlbff, htmlbff_size);
            if (tmp)
            {
                htmlbff = tmp;
            }
            else
            {
                /* memory allocation failure. */
                free(htmlbff);
                htmlbff = 0;
                break;
            }
        }
        memcpy(htmlbff + q, databff, c);
        q += c;
    }
}

关于c - 如何存储 recv() 的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112598/

相关文章:

C 全局结构 : "error: expected expression before ' {' token"

c - 使用命令行中的值形成字符数组并将其传递给其他函数

c - 如何将 gchar 转换为 char?

带有扩展对象的动态键的 typescript 接口(interface)

css - 动态数据库驱动的 CSS 2.0

c - 使用 C 使用 pic16f877a 同时运行多个函数

c - 为什么套接字会拒绝连接?

c++ - Boost C++ UDP 示例无法通过互联网传输

close() 没有正确关闭套接字

ios - 使用 NSString 以编程方式访问或创建 Objective-C 中的方法