在C语言中,我有可以工作的代码,但不知道它为什么工作,所以我开始重写它,这样我就可以真正理解发生了什么。
到目前一切尚好!我重写了,并且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;
}
所以(如果我这样做是对的,事情就像我想象的那样) c
是当前数据块的大小,q
是到目前为止收到的数据总量(每次循环重复,q
都会按c
递增)。目前,我正在使用q
进行内存处理(如果有人想知道的话),但我相信它在解决这个问题时也会有用处。
无论如何,我问的问题都是关于第二个评论的。如何正确地将recv中的数据存储到htmlbff
中?
发布于 2012-08-24 15:48:10
使用memcpy
,并通过q
偏移htmlbff
memcpy(htmlbff + q, databff, c);
同样,您也可以直接使用recv
进入htmlbff
c = recv(sock, htmlbff + q, MAXDATASIZE, 0));
但是,保留一个单独的缓冲区是很好的,根据您的完整代码,它可能会使事情变得更清楚。
确保添加针对BUFFERSIZE
的检查,这样就不会复制超出htmlbff
的界限。您提到您已经剥离了realloc
处理,所以可能您已经在处理这个问题了。
你的常量名称有点令人困惑,在缓冲数据时,我会使用BUFFERSIZE
来表示每个块的大小,即databff
的大小。
发布于 2012-08-24 15:50:44
使用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;
}
}
发布于 2012-08-24 15:51:24
我要做的就是将数据直接recv()
到htmlbff
中,除非你需要对它做更多的处理。
确保在i - q
小于MAXDATASIZE
时realloc()
htmlbff
,以便始终有空间容纳另一个recv()
。
然后,您将调用recv(sock, htmlbff + q, MAXDATASIZE, 0)
https://stackoverflow.com/questions/12112598
复制