在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
中? 最佳答案
使用memcpy
,并通过htmlbff
偏移q
:
memcpy(htmlbff + q, databff, c);
类似地,您可以直接进入
recv
:c = recv(sock, htmlbff + q, MAXDATASIZE, 0));
但是保留一个单独的缓冲区是可以的,而且根据您的完整代码,它可能会使事情更清楚。
确保添加了对
htmlbff
的检查,这样就不会复制超过BUFFERSIZE
的界限。你提到你已经取消了htmlbff
处理,所以也许你已经在处理这个了。当缓冲数据时,我会使用
realloc
来指示每个块的大小,即BUFFERSIZE
的大小,您的常量名称有点混乱。