使用Boost.Asio异步下载URL列表

时间:2015-05-29 14:38:12

标签: c++ asynchronous boost boost-asio

我是异步编程和Boost.Asio的新手。我有一个基本问题。 boost.org上有example。我想用它来下载一个链接列表。以下是http异步客户端的客户端代码。

int main(int argc, char* argv[]) {
  try {
    if (argc != 3) {
      ...
      return 1;
    }

    boost::asio::io_service io_service;
    client c(io_service, argv[1], argv[2]);
    io_service.run();
  }
  catch (std::exception& e) {
    std::cout << "Exception: " << e.what() << "\n";
  }
  return 0;
}

我知道如何使用此代码下载网址。但是,我无法实现如何异步编辑:同时?)下载网址列表。你可以帮助我改变这段代码来实现这个目的吗?

2 个答案:

答案 0 :(得分:2)

Boost.Asio的作者Christopher M. Kohlhoff有一个Urdl HTTP客户端库。

该库有一个允许异步操作的read_stream类。根据{{​​3}},它看起来像这样:

#include <urdl/read_stream.hpp>

boost::asio::io_service io_service;
// run io_service some way

urdl::read_stream in(io_service);
std::ostream& out = std::cout;
char data[1024];

void open_handler(boost::system::error_code const& ec);
void read_handler(boost::system::error_code const& ec, std::size_t length);

in.async_open("http://example.com/path", open_handler);


void open_handler(boost::system::error_code const& ec)
{
  if (!ec)
  {
    in.async_read_some(boost::asio::buffer(data), read_handler);
  }
}

void read_handler(boost::system::error_code const& ec, std::size_t length)
{
  if (!ec)
  {
    out.write(data, length);
    in.async_read_some(boost::asio::buffer(data), read_handler);
  }
}

答案 1 :(得分:1)

样本中的异步存在于所有连接都是异步处理的事实。这使得许多下载可以在一个线程上同时运行(在您的问题的代码示例中,这是主线程)。

所以样本已经是异步的。现在,您正在寻找其他代码的并发性:)

- &GT;只需在单独的线程上执行io_service::run调用(或在线程上执行其他工作)。