首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何存储recv()的输出?

如何存储recv()的输出?
EN

Stack Overflow用户
提问于 2012-08-24 23:43:55
回答 4查看 2.5K关注 0票数 6

在C语言中,我有可以工作的代码,但不知道它为什么工作,所以我开始重写它,这样我就可以真正理解发生了什么。

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

考虑以下代码(请注意,我对此进行了相当大的精简,因此它只包含基本内容,例如,没有内存重新分配或泄漏保护等...):

代码语言:javascript
代码运行次数:0
运行
复制
#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是当前数据块的大小,q是到目前为止收到的数据总量(每次循环重复,q都会按c递增)。目前,我正在使用q进行内存处理(如果有人想知道的话),但我相信它在解决这个问题时也会有用处。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-24 23:48:10

使用memcpy,并通过q偏移htmlbff

代码语言:javascript
代码运行次数:0
运行
复制
memcpy(htmlbff + q, databff, c);

同样,您也可以直接使用recv进入htmlbff

代码语言:javascript
代码运行次数:0
运行
复制
c = recv(sock, htmlbff + q, MAXDATASIZE, 0));

但是,保留一个单独的缓冲区是很好的,根据您的完整代码,它可能会使事情变得更清楚。

确保添加针对BUFFERSIZE的检查,这样就不会复制超出htmlbff的界限。您提到您已经剥离了realloc处理,所以可能您已经在处理这个问题了。

你的常量名称有点令人困惑,在缓冲数据时,我会使用BUFFERSIZE来表示每个块的大小,即databff的大小。

票数 2
EN

Stack Overflow用户

发布于 2012-08-24 23:50:44

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

例如:

代码语言:javascript
代码运行次数:0
运行
复制
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;
    }
}
票数 5
EN

Stack Overflow用户

发布于 2012-08-24 23:51:24

我要做的就是将数据直接recv()htmlbff中,除非你需要对它做更多的处理。

确保在i - q小于MAXDATASIZErealloc() htmlbff,以便始终有空间容纳另一个recv()

然后,您将调用recv(sock, htmlbff + q, MAXDATASIZE, 0)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12112598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档