我正在创建一个简单的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)或直接从套接字文件处理数据,但在我尝试之前我来这里寻找更好的解决方案,是否有正式的方法来做到这一点?如果能有人帮助我,我会感谢你。
答案 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;
}
感谢大家的关注。