使用wininet的异步请求

时间:2009-12-29 22:00:52

标签: c++ asynchronous wininet

我已经使用wininet发送一些同步HTTP请求。现在,我想更进一步,想要异步请求一些内容。

目标是获得类似“反向代理”的东西。我发送一个HTTP请求,一旦有人想联系我,就会得到延迟回复。我的线程应该继续,好像同时没有任何东西,并且一旦响应到达就应该在该线程中调用回调。请注意,我不想要第二个处理回复的线程(如果有必要,它应该只提供一些中断主线程以调用回调的机制)!

更新:也许,描述我想要的最好的方法是像JavaScript这样的行为,你只有一个线程,但可以发送AJAX请求,然后导致在这个主要调用回调线程。

由于我想了解它的工作原理,我不想要库解决方案。有没有人知道一些很好的教程,它解释了我如何实现我想要的行为?

2 个答案:

答案 0 :(得分:1)

  

我的线程应该像在那里一样继续   什么都没有,同时也是   应该在此调用回调   线程一响应   到达。

你在这里要求的基本上是COME FROM(而不是GO TO)。这是一个神秘的指令,并不存在。调用代码的唯一方法是在发布线程中进行轮询,或者使用一个执行同步IO的单独线程,然后执行回调(在该线程中,或在另一个生成的线程中)

当我使用套接字在C ++中工作时,我设置了一个专用线程来遍历所有打开的套接字,轮询可以无阻塞地获得的数据,获取数据并将其填充到缓冲区中,将缓冲区发送到在特定情况下回调(EOL,EOF,那种事情)。

答案 1 :(得分:1)

除非您的主线程正在侦听类似于消息队列的内容,否则实际上没有办法劫持它并开始执行除当前正在执行的代码之外的其他代码。

看看boost :: asio是如何工作的,它基本上可以让你异步连接,读取,写入等...例如你用主要(或任何)线程启动异步读取,asio然后使用重叠IO要求操作系统通知IO完成IO。当异步读取完成时,您的回调将由其中一个工作线程执行。

您需要做的就是确保使用主线程或工作线程调用io_service :: run()来处理IO完成队列。您调用的任何线程都将执行回调。

如果遵循规则,Asio有一些保证可以使这种多线程方法相当健壮。

看看documentation for asio即使你不打算使用它,如果这是你想要解决的问题,很多模式和想法都很有趣。

如果您不想查看它,请记住,在Windows上,执行异步IO的方法称为“Overlapped IO”。