阅读HTTP响应

时间:2015-02-03 10:12:14

标签: c++ http

我正在创建一个简单的HTTP客户端来从网上下载特定文件,我在阅读数据时遇到了问题,这是我的循环:

    do{
        client.readString(aux, 256);
        req.append(aux);
    }while(client.canRead());

客户端是一个TCPClient对象,这很好,方法canRead使用select()来测试是否有可用数据,我认为程序读取数据的速度很快,有时候在新数据收入和返回之前调用canRead是的,所以我没有阅读所有的回复,以证明我说的是我使用这段代码:

    AGAIN:
    do{
        client.readString(aux, 256);
        req.append(aux);
    }while((test = client.canRead()));

    if(!test){
        std::cout << "false\n";
        std::cout << req << std::endl << std::endl;
        system("pause>null");
        goto AGAIN;
    }

所以当我回到AGAIN时,有更多的数据需要读取,我知道canRead方法工作正常,问题是我不知道何时停止读取数据,并且明确不依赖于此方法。为了解决这个问题,我只看到两个解决方案,对代码进行一些延迟(Sleep)或直接从套接字文件处理数据,但在我尝试之前我来这里寻找更好的解决方案,是否有正式的方法来做到这一点?如果能有人帮助我,我会感谢你。

1 个答案:

答案 0 :(得分:0)

问题解决了,使用一种方法来查看数据,我查看了数据,直到找到第一个&#39; \ r \ n \ r \ n&n;这表示响应头的结束,然后我得到大小,直到这个&#39; \ r \ n \ r \ n&#39;并从套接字读取此数据量,所以我处理标题:看看是否有内容长度或传输编码(现在我只支持chunked因为是我的程序需要的唯一一个)成员并调用scpecific方法&#34;解码&#34;响应机构。所以代码是:

    do{
        //if the header never ends....
        if(req.size() > MAX_HEADER_SIZE)
            throw std::runtime_error("Invalid HTTP header.");

        req = peekAvailable(client);
    }while((header_end = req.find("\r\n\r\n")) == std::string::npos);

    client.readString(req, header_end + 4);
    //... Here comes the part to interpret the header information...

peekAvailable方法是:

    std::string peekAvailable(TCPClient& client){
    uint32 available_data;
    std::string data;

    while((available_data = client.getAvailableData()) == 0){
        //Here implement a timeout counter....
        Sleep(1);
    }

    client.peekString(data, available_data);

    return data;
    }

感谢大家的关注。