如何存储recv()的输出?

Kei*_*ler 6 c sockets dynamic recv

在CI有工作代码,但不知道为什么它工作,所以我开始重写它,所以我真的可以理解发生了什么.

到现在为止还挺好!我重写了,并且90%确定我理解现在发生的一切; 但问题是,我不知道如何将recv(databff)收到的数据块存储到我预先分配的缓冲区(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;           
}
Run Code Online (Sandbox Code Playgroud)

所以(如果我这样做,事情就像我认为的那样)c是当前数据块的大小,并且q是到目前为止接收的数据总量(每次循环重复时q递增c).目前我正在使用q内存处理(如果有人想知道),但我相信它也有解决这个问题的目的.

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

hmj*_*mjd 5

使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)


pb2*_*b2q 2

使用memcpy, 并htmlbff偏移q:

memcpy(htmlbff + q, databff, c);
Run Code Online (Sandbox Code Playgroud)

您可以类似地recv直接进入htmlbff

c = recv(sock, htmlbff + q, MAXDATASIZE, 0));
Run Code Online (Sandbox Code Playgroud)

但是保留一个单独的缓冲区是可以的,并且根据您的完整代码,它可能会让事情变得更清晰。

请务必添加检查BUFFERSIZE,以免复制超出htmlbff. 您提到您已经取消了realloc处理,所以也许您已经在处理这个问题了。

您的常量名称有点令人困惑,当缓冲数据时,我会使用它BUFFERSIZE来指示每个chunk的大小,即databff.