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

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

[libtorrent] tracker 逻辑及源码解析(调试)相关推荐

  1. 消息中间件RocketMQ源码解析-- --调试环境搭建

    1. 依赖工具 JDK :1.8+ Maven IntelliJ IDEA 2. 源码拉取 从官方仓库 [https://github.com/apache/rocketmq) Fork 出属于自己的 ...

  2. dubbo源码解析-逻辑层设计之服务降级

    Dubbo源码解析系列文章均来自肥朝简书 前言 在dubbo服务暴露系列完结之后,按计划来说是应该要开启dubbo服务引用的讲解.但是现在到了年尾,一些朋友也和我谈起了明年跳槽的事.跳槽这件事,无非也 ...

  3. 从源码解析-结合Activity加载流程深入理解ActivityThrad的工作逻辑

    ActivityThread源码解析 前言 类简称 类简介 一 二 三 四 五 代理和桩的理解 ActivityThread ActivityThread.main AT.attach AMN.get ...

  4. Robot Arm 机械臂源码解析

    Robot Arm 机械臂源码解析 说明: ​ Robot Arm是我复刻,也是玩的第一款机械臂.用的是三自由度的结构,你可以理解为了三个电机,三轴有自己的一些缺陷.相比于六轴机械臂而言因为结构的缺陷 ...

  5. Simple Dynamic Strings(SDS)源码解析和使用说明二

    在<Simple Dynamic Strings(SDS)源码解析和使用说明一>文中,我们分析了SDS库中数据的基本结构和创建.释放等方法.本文将介绍其一些其他方法及实现.(转载请指明出于 ...

  6. 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现

    写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...

  7. python flask源码解析_用尽洪荒之力学习Flask源码

    [TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...

  8. SpringMVC源码解析

     一:springmvc运行过程: 1. dispatcherServlet 通过 HandlerMapping 找到controller 2. controller经过后台逻辑处理得到结果集mode ...

  9. Heritrix 3.1.0 源码解析(八)

    本文接着分析存储CrawlURI curi的队列容器,最重要的是BdbWorkQueue类及BdbMultipleWorkQueues类 BdbWorkQueue类继承自抽象类WorkQueue,抽象 ...

  10. usestate中的回调函数_React Hooks 源码解析(3):useState

    React 源码版本: v16.11.0 源码注释笔记: airingursb/react​github.com 在写本文之前,事先阅读了网上了一些文章,关于 Hooks 的源码解析要么过于浅显.要么 ...

最新文章

  1. 机器人也需要拥有属于自己的性格
  2. 使用密钥验证方式登录linux系统
  3. 关于从页面中获取用户控件中的其它控件(如DropDownList)事件的方法
  4. QUIC助力Snapchat提升用户体验
  5. $_FILE函数总结
  6. 【算法学习笔记】19.算法设计初步 最大子列和问题的几种方法
  7. 带滤镜拍照的app_抖音很火的同款拍照(P图)技巧
  8. Golang--defer的mi魂汤
  9. 抱团股大跌,亏了谁的钱?
  10. 如何实现一个php框架系列文章【2】实现类的自动加载
  11. Lecture Notes: Macros
  12. 【GIS开发者】(GISDeveloper) 11-14期 提供下载
  13. 用jTessBoxEditor自动训练3500常用汉字
  14. FIT2CLOUD飞致云正式推出X-Lab孵化器,首期发布两款开源软件
  15. 解决gbk转utf8乱码
  16. java中字符串逆序_[Java教程]一行代码实现字符串逆序输出
  17. 酷的计算机名字,女生超酷的群名大全
  18. #PIPE# PIPE之 形而上
  19. 小心肝队-冲刺日志(第七天)
  20. 想在Android应用程序中将XLS文件转换为PDF吗?看完这篇教程就懂了

热门文章

  1. 使用shell命令行查询wifi信号强度
  2. 详解网易有道AI战略,智能硬件、教育、办公三大解决方案
  3. 4. 嵌入式OpenWRT入门基础篇-----设置OpenWRT系统为AP、中继模式
  4. 北航计算机本科生考研,和计算机考研的师弟师妹们分享一下经验本人本科北航...
  5. 高铁线路开通数据(更新至2021年10月)
  6. 详解ResNet残差网络
  7. springboot 银联支付(扫码支付)
  8. redis与数据库同步的解决方案
  9. java根据地址解析省市区信息
  10. [精品书单]3D打印机课程设计