C++ http中的范围下载

C++ http中的范围下载,c++,sockets,get,request,range,C++,Sockets,Get,Request,Range,我需要分块下载一个html页面。我已经建立了一个GET-reuest,它可以下载一定范围的数据。但我没有成功地重复这样做。 基本上我必须先接收0-99字节,然后是100-199字节,依此类推。。。 我也很感谢知道如何使用C或C++代码预先知道接收文件的准确大小。 下面是我的代码。 我已免除连接插座等,因为它已成功完成 int c=0,s=0; while(1) { get = build_get_query(host, page,s); c+=1; fprintf(std

我需要分块下载一个html页面。我已经建立了一个GET-reuest,它可以下载一定范围的数据。但我没有成功地重复这样做。 基本上我必须先接收0-99字节,然后是100-199字节,依此类推。。。 我也很感谢知道如何使用C或C++代码预先知道接收文件的准确大小。 下面是我的代码。 我已免除连接插座等,因为它已成功完成

int c=0,s=0;
while(1)
{
    get = build_get_query(host, page,s);
    c+=1;
    fprintf(stderr, "Query is:\n<<START>>\n%s<<END>>\n", get);
    //Send the query to the server
    int sent = 0;
    cout<<"sending "<<c<<endl;
    while(sent < strlen(get))
    {
        tmpres = send(sock, get+sent, strlen(get)-sent, 0);
        if(tmpres == -1)
        {
            perror("Can't send query");
            exit(1);
        }
        sent += tmpres;
    }
    //now it is time to receive the page
    memset(buf, 0, sizeof(buf));
    int htmlstart = 0;
    char * htmlcontent;
    cout<< "reciving "<<c<<endl;
    while((tmpres = recv(sock, buf, BUFSIZ, 0)) > 0)
    {
        if(htmlstart == 0)
        {
            /* Under certain conditions this will not work.
            * If the \r\n\r\n part is splitted into two messages
            * it will fail to detect the beginning of HTML content
            */
            htmlcontent = strstr(buf, "\r\n\r\n");
            if(htmlcontent != NULL)
            {
                htmlstart = 1;
                htmlcontent += 4;
            }
        }
        else
        {
            htmlcontent = buf;
        }
        if(htmlstart)
        {
            fprintf(stdout, htmlcontent);
        }

        memset(buf, 0, tmpres);
    }
    if(tmpres < 0)
    {
        perror("Error receiving data");
    }
    s+=100;
    if(c==5)
        break;
}


char *build_get_query(char *host, char *page,int i)
{
char *query;
char *getpage = page;

int j=i+99;
char tpl[100] = "GET /%s HTTP/1.1\r\nHost: %s\r\nRange: bytes=%d-%d\r\nUser-    Agent: %s\r\n\r\n";

if(getpage[0] == '/')
{
    getpage = getpage + 1;
    fprintf(stderr,"Removing leading \"/\", converting %s to %s\n", page,  getpage);
}

query = (char     *)malloc(strlen(host)+strlen(getpage)+8+strlen(USERAGENT)+strlen(tpl)-5);
sprintf(query, tpl, getpage, host, i , j, USERAGENT);
return query;
}
intc=0,s=0;
而(1)
{
get=build\u get\u查询(主机、页面);
c+=1;
fprintf(stderr,“查询是:\n\n%s\n”,get);
//将查询发送到服务器
int sent=0;
库特
我也很高兴知道如何用C或C++代码预先知道接收文件的准确大小。
如果服务器支持对特定资源的范围请求(不保证),则答案如下:

 HTTP/1.1 206 partial content
 Content-Range: bytes 100-199/12345
这意味着响应将包含字节100..199,并且内容的总大小为12345字节

这里有很多关于解析HTTP头的问题,因此我将不详细介绍如何专门使用C/C++从头中提取这些数据


还请注意,您正在执行HTTP/1.1请求,因此必须处理可能的分块响应和隐式保持活动。我真的建议使用现有的HTTP库,而不是手工操作和出错。如果您真的想自己实现,请学习。

总大小是HTTP头的最后一部分呃IIRC。你能告诉我更多关于HTTP库的信息吗?以及如何从标题中提取这些数据,因为我确实需要接收内容的总大小。@ridhikumari:这有多困难?快速给你带来了什么?谢谢你的帮助!:)