C ++并发GET请求

时间:2009-04-30 21:51:15

标签: c++ http concurrency networking get

我正在编写一个C ++应用程序,并希望同时通过HTTP GET请求请求多个数据文件,我应该在哪里开始(需要跨平台)。

  1. 运行应用程序
  2. 创建网址列表{“http://host/file1.txt”,“http://host/file2.txt”,“http://host/file3.txt”}
  3. 同时请求所有URL并将内容加载到变量(不想要磁盘写入)。每个文件大约有10kB的数据。
  4. 您建议我使用哪些图书馆? libcurl的? curlpp?提升asio?我是否需要滚动自己的多线程来同时请求所有文件?有更简单的方法吗?

    编辑:我需要同时请求大约1000个GET请求。我很可能会批量执行此操作(一次100个,并创建更多连接,因为一个已完成)。

2 个答案:

答案 0 :(得分:4)

我会推荐libcurl。我对它并不十分熟悉,但它确实有一个multi-interface来执行多个同步HTTP操作。

根据您使用的解决方案,可以在不使用多线程的情况下执行异步I / O.关键是使用select(2)系统调用。 select()获取一组文件描述符,并告诉您是否有任何数据可用。如果他们这样做,您可以继续使用read(2)recv(2),而无需担心阻止。

答案 1 :(得分:2)

Web浏览器通常会维护一个工作线程池来进行下载,并在它们空闲时为其分配下载。 IIRC,HTTP RFC可以说明你应该同时为同一台服务器建立多少个同时连接:太多是粗鲁的。

如果有几个请求是同一个服务器,并且它支持keep-alive(几乎每个人都这样做),那么这可能比通过多个同时请求发送垃圾邮件更好。一般的想法是您为串行的多个请求使用一个TCP / IP连接,从而节省了握手开销。根据我实现Java HTTPConnection类的经验,实际结果是你引入了一个微妙的错误,当你为新请求重新使用连接时并不总是正确地清除状态,并花费大量时间盯着日志/嗅探器数据; - )

libcurl肯定支持keepalive(我认为默认启用)。