通过HTTP接收数据 - 大小不一致

时间:2014-03-21 22:30:19

标签: c http

memset(buf, 0, sizeof(buf));
    int htmlstart = 0;
    char * htmlcontent;
    char *mainpage = (char *) malloc(MAXBUF);
    while((tmpres = recv(sock, buf, MAXBUF, 0)) > 0)
    {
        if(htmlstart == 0) //on first run, ignore headers
        {
            htmlcontent = strstr(buf, "\r\n\r\n");
            if(htmlcontent != NULL)
            {
                htmlstart = 1;
                htmlcontent += 4;
            }
        }
        else
        {
            htmlcontent = buf;
        }
        if(htmlstart)
        {
            mainpage = (char *) realloc( mainpage, (strlen(mainpage) + strlen(htmlcontent) + 1) );
            // printf("%s",htmlcontent);
            strcat(mainpage,htmlcontent);
        }
        memset(buf, 0, tmpres);
    }
    if(tmpres < 0)
    {
        perror("Error receiving data");
    }

    printf("%d",(int)strlen(mainpage));

我写了一个简单的程序,在与服务器建立连接后通过HTTP接收数据。但是如果我尝试接收像图像这样的大对象,我就会遇到一个奇怪的问题。每次我运行程序时,打印HTTP数据总大小(没有标题)的最后一个print语句就会出现不同。所以我收到的是图像的损坏图像/部分。

有关为何会发生这种情况的任何想法?

编辑:如果在与htmlcontent连接之前检查mainpage的累积大小,那么在整个收据之后,大小与mainpage的大小相同。所以问题不能出现在strcat或任何其他字符串函数中。

2 个答案:

答案 0 :(得分:1)

您忘记实施HTTP协议了! HTTP协议指定您何时知道整个对象的使用情况,例如,使用Content-Length标头之类的内容。 必须实施该协议。 recv函数只知道它是从字节流中读取的。

此外,您对strlenstrcat的使用不正确。 recv函数告诉您它收到了多少字节。 strlen函数仅适用于字符串,而不是您尚未解析或处理的任意数据块。

答案 1 :(得分:0)

如果您strcat() undefined buffer (mainpage)strlen()将会返回任意结果。