正文

入口函数

入口函数

命令行参数检查

命令行参数检查

设置信号处理的回调函数

设置信号处理的回调函数

set_signal_handler

[Not supported by viewer]

对于 SIGPIPE 直接忽略

[Not supported by viewer]

对于中断信号(SIGINT
和终止信号(SIGTERM
移交给 process_signal 处理

[Not supported by viewer]

解析 torrent 文件

解析 torrent 文件

初始化未阻塞 peers

初始化未阻塞 peers

创建下载文件

创建下载文件

创建位图

创建位图

创建缓冲

创建缓冲

数据传输

数据传输

收尾工作

收尾工作

退出

退出

process_signal 

process_signal 

直接进行收尾工作

直接进行收尾工作

信号处理模块

信号处理模块

parse_metafile

[Not supported by viewer]

读取种子文件到内存

读取种子文件到内存

获取 tracker 服务器的地址

获取 tracker 服务器的地址

判断是否为多文件种子

判断是否为多文件种子

获取每个 piece 的长度

获取每个 piece 的长度

读取各个 piece 的哈希值

读取各个 piece 的哈希值

获取要下载的文件名(或者目录名)

获取要下载的文件名(或者目录名)

(多文件种子)获取各个待下载的文件路径和文件长度

(多文件种子)获取各个待下载的文件路径和文件长度

获取待下载的文件的总长度

获取待下载的文件的总长度

获得 info_hash

[Not supported by viewer]

生成 peer_id

[Not supported by viewer]

种子解析模块

种子解析模块

初始化全局变量 unchoke_peers

初始化全局变量 unchoke_peers

create_files

[Not supported by viewer]

获取种子中待下载文件的个数

获取种子中待下载文件的个数

为每个文件申请描述符

为每个文件申请描述符

多文件

多文件

创建与下载文件大小相等的文件并写入空字符  

[Not supported by viewer]

创建(多级)目录

创建(多级)目录

遍历链表,创建各个所需文件,并写入空字符

遍历链表,创建各个所需文件,并写入空字符

为 bitmap 结构初始化

为 bitmap 结构初始化

create_bitfield

[Not supported by viewer]

全新下载

全新下载

设置位图的各位为 0

设置位图的各位为 0

读取现有位图

读取现有位图

设定正确的值给 download_piece_num

设定正确的值给 download_piece_num

实现了断点续传

实现了断点续传

create_btcache

[Not supported by viewer]

1024(缓冲节点数量)次 for 循环

1024(缓冲节点数量)次 for 循环

初始化当前缓冲节点

初始化当前缓冲节点

循环

循环

连接该节点与下一个节点

连接该节点与下一个节点

连接该节点与下一个节点

连接该节点与下一个节点

初始化最后一个 piece 的缓存空间和 index

初始化最后一个 piece 的缓存空间和 index

initialize_btcache_node

initialize_btcache_node

为节点分配内存

为节点分配内存

为节点的 buff 分配内存

为节点的 buff 分配内存

初始化结构体的其它值

初始化结构体的其它值

文件预备模块

文件预备模块

位图管理模块

位图管理模块

缓冲管理模块

缓冲管理模块

download_upload_with_peers

download_upload_with_peers

局部变量初始化

局部变量初始化

进入主循环

进入主循环

每隔 10 秒重新选择非阻塞 peer

每隔 10 秒重新选择非阻塞 peer

每隔 30 秒重新选择可选非阻塞 peer

每隔 30 秒重新选择可选非阻塞 peer

计算各个 peer 的下载、上传速度

计算各个 peer 的下载、上传速度

选择非阻塞的 peer

选择非阻塞的 peer

将那些在过去 10 秒已断开连接而又处于 unchoke 队列中的 peer 清除出 unchoke 队列

[Not supported by viewer]

将那些在过去 10 秒上传速度超过 20KB/S 而下载速度过小的 peer 强行阻塞

将那些在过去 10 秒上传速度超过 20KB/S 而下载速度过小的 peer 强行阻塞

从当前所有 Peer 中选出下载速度最快的四个 peer

从当前所有 Peer 中选出下载速度最快的四个 peer

更新 peer

[Not supported by viewer]

对 peer 的状态值重新赋值

对 peer 的状态值重新赋值

创建 choke、unchoke 消息

创建 choke、unchoke 消息

create_chock_interested_msg

create_chock_interested_msg

select_optunchoke_peer

select_optunchoke_peer

每隔 5 分钟
  <p>
    或当前 peer 数为 0
  </p>
连接 tracker

[Not supported by viewer]

如果要连接新的 peer

如果要连接新的 peer

创建套接字,向 peer 发出连接请求

创建套接字,向 peer 发出连接请求

状态更新为连接中

状态更新为连接中

开始连接时间改为现在

开始连接时间改为现在

用 FD_ZERO 初始化(清空)
  <p>
    <span> 套接字集合 </span></div></div> 

[Not supported by viewer]

如果状态为连接中

如果状态为连接中

将连接 tracker 的 socket 加入到待监视的集合中

将连接 tracker 的 socket 加入到待监视的集合中

如果连接 tracker 超过 10 秒,则终止连接 tracker

如果连接 tracker 超过 10 秒,则终止连接 tracker

否则连接各个 tracker

否则连接各个 tracker

如果状态为连接 tracker 结束

如果状态为连接 tracker 结束

与 peer 建立连接

与 peer 建立连接

clear_connect_tracker

clear_connect_tracker

清理连接的 tracker 数量为 0

清理连接的 tracker 数量为 0

clear_tracker_response

clear_tracker_response

设置 response_len 为零

设置 response_len 为零

设置 response_index  为零

[Not supported by viewer]

如果 peer_addr_head 不为空,说明可以建立 peer 链接
设置 connect_peer = -1

[Not supported by viewer]

否则 connect_tracker =1;

[Not supported by viewer]

将 peer 的 socket 成员加入到待监视的集合中

将 peer 的 socket 成员加入到待监视的集合中

遍历 peer 的链表,初始化各个 socket

遍历 peer 的链表,初始化各个 socket

遍历 peer 的链表,初始化各个 socket

遍历 peer 的链表,初始化各个 socket

设置 select 函数的超时时间

设置 select 函数的超时时间

对各个读写 set 进行 select,等待请求到来

对各个读写 set 进行 select,等待请求到来

请求到来,执行 prepare_
send_have_msg

[Not supported by viewer]

向所有的 peer 发送 have 消息

向所有的 peer 发送 have 消息

遍历各个 peer

遍历各个 peer

如果状态为未关闭,且为 rset

如果状态为未关闭,且为 rset

接收消息

[Not supported by viewer]

成功则解析所有的消息

成功则解析所有的消息

如果状态为未关闭,且为 wset

如果状态为未关闭,且为 wset

发送各种消息

发送各种消息

如果正在与 tracker 服务器相连

如果正在与 tracker 服务器相连

对于每个 tracker

对于每个 tracker

如果建立好了套接字,但是还没有连接

如果建立好了套接字,但是还没有连接

尝试 getsockopt 获取套接字选项

[Not supported by viewer]

如果 已经成功建立了连接

如果 已经成功建立了连接

构建 tracker 服务器的地址链表

构建 tracker 服务器的地址链表

向 tracker 服务器发送请求消息

向 tracker 服务器发送请求消息

如果需要 状态主机从 tracker 服务器中得到数据

[Not supported by viewer]

读取并处理数据

读取并处理数据

如果正在与 peer 建立连接

[Not supported by viewer]

遍历各个 peer

遍历各个 peer

getsockopt

[Not supported by viewer]

添加 peer 到 peer 链表

添加 peer 到 peer 链表

对处于 CLOSING 状态的 peer, 将其从 peer 队列中删除

[Not supported by viewer]

下载完毕的检测

下载完毕的检测

数据传输和消息通信模块

数据传输和消息通信模块

    <h1>
      致谢
    </h1>

感谢 Sky,July,Aspire 的帮助。否则我难以短时间掌握这样一个大的系统的原理。

更新于 Sep 04, 2021 16:51 CST
如果有任何问题或者需要反馈文章的错误,欢迎您在此评论。