[libtorrent] tracker 逻辑及源码解析(调试)

操作系统: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: 表示种子被下载的数量。
 

完结。建议读者也实际打断点,通过调试进行查看。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 libtorrent4j 下载种子,您需要进行以下操作: 1. 导入 libtorrent4j 库和相关的模块,例如: ```java import com.frostwire.jlibtorrent.*; ``` 2. 创建一个 `SessionManager` 对象,并设置一些参数,例如: ```java SettingsPack settings = new SettingsPack(); settings.setInteger(SettingsPack.int_types.download_rate_limit.swigValue(), 1000); settings.setInteger(SettingsPack.int_types.upload_rate_limit.swigValue(), 1000); SessionManager s = new SessionManager(); s.applySettings(settings); s.start(); ``` 在这个例子中,我们设置了最大下载速度和上传速度为 1000 B/s,并创建了一个 `SessionManager` 对象。然后,我们使用 `applySettings` 方法将设置应用于会话管理器,并使用 `start` 方法启动会话管理器。 3. 创建一个 `TorrentHandle` 对象,并通过 `addTorrentInfo` 方法将种子添加到会话管理器中,例如: ```java String torrentFilePath = "/path/to/torrent/file"; byte[] torrentFileBytes = Files.readAllBytes(Paths.get(torrentFilePath)); TorrentInfo torrentInfo = new TorrentInfo(torrentFileBytes); TorrentHandle torrentHandle = s.getTorrents().addTorrentInfo(torrentInfo); ``` 在这个例子中,我们将种子文件读入 `byte` 数组中,并使用 `TorrentInfo` 对象解析种子文件的元数据。然后,我们使用 `addTorrentInfo` 方法将元数据添加到会话管理器中,并获得一个 `TorrentHandle` 对象,用于管理下载进程。 4. 启动下载进程,例如: ```java torrentHandle.resume(); ``` 在这个例子中,我们使用 `resume` 方法启动下载进程。 5. 等待下载完成,并关闭会话管理器,例如: ```java while (!torrentHandle.isFinished()) { System.out.println("Downloaded: " + torrentHandle.getStatus().getProgress() * 100 + "%"); Thread.sleep(1000); } s.stop(); ``` 在这个例子中,我们使用 `isFinished` 方法检查下载进程是否完成,如果没有完成,则打印下载进度,并使用 `Thread.sleep` 方法暂停 1 秒钟。一旦下载完成,我们使用 `stop` 方法关闭会话管理器。 这就是使用 libtorrent4j 下载种子的基本步骤。请注意,这只是一个简单的例子,您可能需要根据具体情况进行更多的设置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值