如何在C ++中使用recv从接收到的数据中剥离标题?

问题描述

我在下面做了此代码,以下载大文件并将其保存到文件中。 (我删除了不重要的部分)

int nDataLength;
int i = 0;
static char buffer[4096];
while ((nDataLength = recv(Socket,buffer,sizeof(buffer),NULL)) > 0)
{
    //MessageBoxA(0,std::to_string(nDataLength).c_str(),"TEST",0);
    fwrite(buffer,nDataLength,1,pFile);
}

现在,它保存文件,但也保存HTTP标头。现在我真的不知道如何从接收到的数据中剥离标题
如果足够小,我可以从缓冲区读取Content-Length,然后再次打开文件删除标头,但这不是选项,因为缓冲区将被新数据覆盖。

我也不能使用其他库,例如libcurl等。

编辑:

char* content = strstr(buffer,"\r\n\r\n");
    if (content != NULL) {
        content += 4;
        fwrite(content,pFile);
    }
    else
    {
        fwrite(buffer,pFile);
    }

解决方法

好的,我想出了在保存之前剥离标题的函数。

 int nDataLength;
int i = 0;
static char buffer[4096];
while ((nDataLength = recv(Socket,buffer,sizeof(buffer),NULL)) > 0)
{
    char* content = strstr(buffer,"\r\n\r\n");
    if (content != NULL) {
        std::string s2(buffer); 
        size_t p = s2.find("\r\n\r\n");
        fwrite(buffer+p+4,nDataLength-p-4,1,pFile);
    }
    else
    {
        fwrite(buffer,nDataLength,pFile);
    }
    
}