操作系统:win10
开发工具:VS2019
(libtorrent 源码的开发环境搭建可以参考:[libtorrent] windows搭建 libtorrent 开发环境_二七-CSDN博客)
(ubuntu BitTorrent 搭建可以参考:[Tracker] linux 搭建 BitTorrent_二七-CSDN博客)
Tracker
客户端监听所有网络接口(不包括回环地址), 发送 get 请求到服务器的 tracker服务,如果请求成功,会获取到 tracker 返回的 peers 信息。
peers包含一个peer列表。一个peer由peer、id、ip、port组成。客户端可以通过这些 peers 进行上传和下载。
根据 tracker list 的不同,分为 UDP Tracker 和 HTTP Tracker
具体逻辑如下。
session_impl 类
(\libtorrent\src\session_impl.cpp)
在 session_impl::reopen_listen_sockets() 方法处打断点,该函数会监听本地的端口。堆栈如下:
其中监听的本地IP和端口如下:
tracker_manager 类
(\libtorrent\src\tracker_manager.cpp)
在 tracker_manager::queue_request() 下断点,该处会根据具体的 tracker 进行 udp/http 请求。
堆栈如下:
如果是 HTTP Tracker,会走以下的逻辑
如果是 UDP Tracker,会走以下的逻辑
http_tracker_connection 类 (HTTPTracker)
(\libtorrent\src\http_tracker_connection.cpp)
在 http_tracker_connection::start() 下断点,该函数会从 tracker 服务器进行请求。堆栈如下:
请求的 url 如下:
在 http_tracker_connection::on_response() 下断点,该函数会获取从 tracker 服务器的响应数据。堆栈如下:
具体解析返回结果是在 parse_tracker_response() 方法中,解析后的数据如下:
udp_tracker_connection 类 (udp tracker)
(\libtorrent\src\udp_tracker_connection.cpp)
和 http tracker 类似,在 udp_tracker_connection::start() 下断点,数据如下:
在 udp_tracker_connection::send_udp_announce() 下断点,该函数会从 tracker 服务器进行请求。堆栈如下:
在该方法中,把 req 内的数据 写入 out
发送数据:
torrent 类 (udp tracker)
(\libtorrent\src\torrent.cpp)
在 torrent::tracker_response() 方法处打断点,该函数接收到 tracker 服务器返回的数据。堆栈如下:
返回的数据结构如下:
PS:
peers4 : 表示其他9个 ipv4 的 peer;
interval: 表示下次请求的时间是 1766 秒;
complete: 表示当前 swarm 中种子的数量是 7;
incomplete: 表示当前 swarm 中当前的下载者数量是 2;
downloaders: 表示当前下载中的 peer 的数量,-1表示当前不支持 tracker;
downloaders: 表示种子被下载的数量。
完结。建议读者也实际打断点,通过调试进行查看。