C++ 从Poco HTTPClientSession异步读取

C++ 从Poco HTTPClientSession异步读取,c++,http,asynchronous,nonblocking,poco-libraries,C++,Http,Asynchronous,Nonblocking,Poco Libraries,使用HTTPClientSession的常见示例代码如下: Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort()); std::ostream& ostr = session.sendRequest(req); // Receive the response. Poco::Net::HTTPResponse res; std::istream& rs = session.receiveResponse

使用HTTPClientSession的常见示例代码如下:

Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());
std::ostream& ostr = session.sendRequest(req);

// Receive the response.
Poco::Net::HTTPResponse res;
std::istream& rs = session.receiveResponse(res);

问题是,我如何从rs输入流读取整个数据,同时确保所有操作都是非阻塞的,以便随时取消它们?

只是一个想法,尝试将代码放入线程中


关于

这有什么帮助?如果你把session.receiveResponse()放在一个线程中,我会无限期地阻止这个新线程,你不必担心它是否被阻止,因为你可以在单独的线程中运行主代码。如果要取消阻塞部分,可以按顺序终止线程或停止它。例如,要在线程之间交换数据,请使用与互斥体同步的引用/指针或队列。如果要在一段时间内阻止receiveResponse(),则应查看time Alives(setKeepAliveTimeout方法)和Timeout。很好,luckOk,然后尝试使用HTTPClientSession::setKeepAliveTimeout()方法为当前连接配置一个小超时。从文档中可以看出,“在sendRequest()被调用或会话被销毁之前,该流是有效的”,因此,如果您的rs流在一段时间内没有收到任何内容,它应该会继续运行而不会出现问题。您可以通过从另一个线程调用HTTPClientSession::abort()中止HTTPClientSession上的阻塞读取。@Günter:调用abort()从另一个线程在Android上是不可行的选项(尽管它在OSX和iOS上工作得很好…),您找到了解决方案吗?