libtorrent代码阅读笔记

1. 在 void session_impl::operator()() 中启动了 io_service m_io_service.
   整个系统使用m_io_service作为网络异步io服务.
   void session_impl::operator()() 是在session_impl构造函数中作为线程对
   象创建的, 代码如下:
   m_thread.reset(new boost::thread(boost::ref(*this)));

2. void session_impl::on_tick(error_code const& e) 是一个100毫秒的定时
   器函数, 内部实际限制了1秒才真的工作. 同上, 也是在session_impl的构造
   函数中创建的, 代码如下:
   m_timer.expires_from_now(milliseconds(100), ec);
   m_timer.async_wait(boost::bind(&session_impl::on_tick, this, _1));
   on_tick的主要功能如下:
   1. 检查连接超时.
   2. 处理暂停下载.
   3. 发起新的连接.
   4. 自动管理torrent.
   5. 计算死连接.
   6. 调整连接数.

   这个函数是个非常重要的函数.

3. peer_connection 类是peer的基类, 在它下面主要有三种类型的连接. 
   1. bt_peer_connection 这是bt连接.
   2. http_seed_connection 是http连接.
   3. web_peer_connection web连接, 和http连着差不多, 只是类型不一样.
   所有结点连接都在libtorrent.aux.session_impl 的 m_connections一个set
   容器里保存.
   1. 新的bt连接进来, 将在void session_impl::incoming_connection(
      boost::shared_ptr<socket_type> const& s)
   函数中添加到m_connections容器中.
   2. http seed 或 web seed 都将在void torrent::connect_to_url_seed(
      web_seed_entry const& web) 或 bool torrent::connect_to_peer(policy::peer* peerinfo)
      中添加到m_connections容器中.

4. void disk_io_thread::operator()() 中运行一个作业队列. 这个函数主
   要为数据下载后存储提供了中间层的一个任务队列. 其中包括读操作请求
   , 写操作请求, 以及hash等操作.
   如: 每当peer下载一个分片, 将投递到这个disk_io_thread线程的队列中,
   然后根据不同的类型进行不同的处理, 如果下载一块数据时, 将会投递写
   入数据的job, 如果一个分片下载完成, 则将会投递请求hash检查下载的分
   片数据是否正确.

以上是libtorrent内部下载主要部分, 关于细节的实现, 有空再进一步分析.

你可能感兴趣的:(boost,asio,libtorrent)