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内部下载主要部分, 关于细节的实现, 有空再进一步分析.