BitTorrent 协议规范(BT协议集合)十七

论文解读 | Transformer 原理深入浅出 Attention 机制由 Bengio 团队于 2014 年提出,并广泛应用在深度学习的各个领域。而 Google 提出的用于生成词向量的 Bert 在 NLP 的 11 项任务中取得了效果的大幅提升,Bert 正是基于双向 Transformer。 Transformer 是第一个完全依赖于 Self-Attention 来计算其输入和输出表示的模型,而不使用序列对齐的 RNN 或 CNN。更... 阅读详情
Encoder 是一种 Handler 类(关于 Handler类,请参看前面的分析文章)。它在 download.py 中被初始化。它与 Connection类一起,完成“BT对等连接”的建立,以及“BT对等协议”的分析。
为了有助于理解,我添加了一些用圆圈括起来的序号,建议你按照这个顺序去阅读。

class Connection:
  ②def __init__(self, Encoder, connection, id, is_local):
    self.encoder = Encoder
    self.connection = connection
如果是本地发起连接,那么 id 是对方的 id,否则 id 为 None
    self.id = id
如果连接是由本地发起的,那么 is_local 为 True,否则为 False
    self.locally_initiated = is_local
    self.complete = False
    self.closed = False
    self.buffer = StringIO()
    self.next_len = 1
    self.next_func = self.read_header_len
如果连接是由本地主动发起建立的,那么需要向对方发送一个握手消息。(如果不是由本地主动发起的,那么就是被动建立的,那么不能在这里发送握手消息,而必须在分析完对方的握手消息之后,再去回应一个握手西消息,请看read_download_id() 中的处理。
    if self.locally_initiated:
        connection.write(chr(len(protocol_name)) + protocol_name +
          (chr(0) * 8) + self.encoder.download_id)
        if self.id is not None:
          connection.write(self.encoder.my_id)

  def get_ip(self):
    return self.connection.get_ip()

  def get_id(self):
    return self.id

  def is_locally_initiated(self):
    return self.locally_initiated

  def is_flushed(self):
    return self.connection.is_flushed()

  ⑦def read_header_len(self, s):
    if ord(s) != len(protocol_name):
        return None
    return len(protocol_name), self.read_header

  def read_header(self, s):
    if s != protocol_name:
        return None
    return 8, self.read_reserved

  def read_reserved(self, s):
    return 20, self.read_download_id
  def read_download_id(self, s):
    if s != self.encoder.download_id:
        return None
这一步很重要, 如果连接是由对方发起的,那么,给对方发送一个握手消息。为什么不在读完了 peer id 之后才发送这个消息了?这是因为 peer id 是可选的,所以只要分析完 download id 之后,就要立即发送握手消息。
    if not self.locally_initiated:
self.connection.write(chr(len(protocol_name)) +
protocol_name +
(chr(0) * 8) +
self.encoder.download_id + self.encoder.my_id)
    return 20, self.read_peer_id

  def read_peer_id(self, s):
    if not self.id:
        如果 peer id 是自己,那么出错了
        if s == self.encoder.my_id:
          return None
        for v in self.encoder.connections.values():
          如果已经跟该 peer 建立了连接了,那么也出错了
          if s and v.id == s:
            return None
        self.id = s
        if self.locally_initiated:
          self.connection.write(self.encoder.my_id)
        else:
          self.encoder.everinc = True
    else:
        如果 peer id 和 xxx 不符,那么出错了。
        if s != self.id:
          return None

“BT对等连接”的握手过程正式宣告完成,此后,双方就可以通过这个连接互相发送消息了。
    self.complete = True

调用Connecter::connection_made(),这个函数的意义,我们到分析 Connecter 类的时候,再记得分析。
    self.encoder.connecter.connection_made(self)

下面进入 BT 消息的处理过程。
    return 4, self.read_len

  def read_len(self, s):
    l = toint(s)
    if l > self.encoder.max_len:
        return None
    return l, self.read_message

消息处理,交给了 Connecter::got_message(),所以下一篇我们要分析 Connecter 类。
  def read_message(self, s):
    if s != '':
        self.encoder.connecter.got_message(self, s)
    return 4, self.read_len

  def read_dead(self, s):
    return None

  def close(self):
    if not self.closed:
        self.connection.close()
        self.sever()

  def sever(self):
    self.closed = True
    del self.encoder.connections[self.connection]
    if self.complete:
        self.encoder.connecter.connection_lost(self)

  def send_message(self, message):
    self.connection.write(tobinary(len(message)) + message)


⑤在 Encoder::data_came_in() 中调用下面这个函数,表示某个连接上有数据可读。如果有数据可读,那么我们就按照 BT 对等协议的规范来进行分析。。。
def data_came_in(self, s):

进入协议分析循环。。。
    while True:
        if self.closed:
          return

self.next_len表示按照BT对等协议规范,下一段要分析的数据的长度
self.buffer.tell() 表示缓冲区中剩下数据的长度
那么 i 就表示:为了完成接下来的协议分析,还需要多少数据?
i = self.next_len - self.buffer.tell()
如果 i 大于所读到的数据的长度,那表示数据还没有读够,无法继续协议分析,需要等读到足够多的数据才能继续,所以只能退出。
        if i > len(s):
          self.buffer.write(s)
          return
否则表示这次读到的数据已经足够完成一步协议分析。
只取满足这一步协议分析的数据放入 buffer 中(因为 buffer中可能还有上一步协议分析后留下的一些数据,要加在一起),剩下的数据保留在 s 中。
        self.buffer.write(s[:i])
s = s[i:]

从 buffer 中取出数据,这些数据就是这一步协议分析所需要的数据。然后把 buffer 清空。
        m = self.buffer.getvalue()
        self.buffer.reset()
self.buffer.truncate()

next_func 就是用于这一步协议分析的函数。
返回的 x 是一个二元组,包含了下一步协议分析的数据长度和协议分析函数。这样,就形成了一个协议分析循环。
        try:
          x = self.next_func(m)
        except:
          self.next_len, self.next_func = 1, self.read_dead
          raise
        if x is None:
          self.close()
          return
从 x 中分解出 next_len和 next_func。
self.next_len, self.next_func = x
⑥那么BT对等协议分析的第一步是什么了?
请看初始化函数:
self.next_len = 1
self.next_func = self.read_header_len
显然,第一步协议分析是由 read_header_len() 来完成的。
在BT源码中,有多处采用了这种协议分析的处理方式。

class Encoder:
  def __init__(self, connecter, raw_server, my_id, max_len,
        schedulefunc, keepalive_delay, download_id,
        max_initiate = 40):
    self.raw_server = raw_server
    self.connecter = connecter
    self.my_id = my_id
    self.max_len = max_len
    self.schedulefunc = schedulefunc
    self.keepalive_delay = keepalive_delay
    self.download_id = download_id
    最大发起的连接数
    self.max_initiate = max_initiate
    self.everinc = False
   
    self.connections = {}
    self.spares = []
   
    schedulefunc(self.send_keepalives, keepalive_delay)

为了保持连接不因为超时而被关闭,所以可能需要随机的发送一些空消息,它的目的纯粹是为了保证连接的“活力”
  def send_keepalives(self):
    self.schedulefunc(self.send_keepalives, self.keepalive_delay)
    for c in self.connections.values():
        if c.complete:
          c.send_message('')

③主动向对方发起一个连接,这个函数什么时候调用?
请看 download.py 中 Rerequester 类的初始化函数,其中传递的一个参数是 encoder.start_connection。
再看 Rerequester.py 中,Rerequester::postrequest() 的最后,
for x in peers:
self.connect((x[0], x[1]), x[2])
这里调用的 connect() 就是初始化的时候传递进来的 encoder.start_connection,也就是下面这个函数了。
也就是说,当客户端从 tracker 服务器那里获取了 peers 列表之后,就逐一向这些 peers 主动发起连接。
  def start_connection(self, dns, id):
    if id:
        跟自己不用建立连接。
        if id == self.my_id:
          return
        如果已经与对方建立起连接,也不再建立连接
        for v in self.connections.values():
          if v.id == id:
            return

    如果当前连接数,已经超过设定的“最大发起连接数”,那么就暂时不建立连接。

    if len(self.connections) >= self.max_initiate:
如果空闲连接数还小于 “最大发起连接数”,那么把对方的 ip 先放到spares中,等以后网络稍微空闲一点的时候,再从 spares 中取出来,实际去建立连接。
        if len(self.spares) < self.max_initiate and dns not in self.spares:
          self.spares.append(dns)
        return
    try:
调用 RawServer::start_connection 与对方建立TCP连接
        c = self.raw_server.start_connection(dns)
       
创建 Connection 对象,加入到 connections 字典中,注意,最后一个参数是 True,表示是这个连接是由本地主动发起的。这样,在 Connection 的初始化函数中,会与对方进行 BT 对等协议的握手。

        self.connections[c] = Connection(self, c, id, True)
    except socketerror:
        pass
 
这个内部函数好像没有用到
  def _start_connection(self, dns, id):
    def foo(self=self, dns=dns, id=id):
        self.start_connection(dns, id)
   
    self.schedulefunc(foo, 0)
   
  def got_id(self, connection):
    for v in self.connections.values():
        if connection is not v and connection.id == v.id:
          connection.close()
          return
    self.connecter.connection_made(connection)

  def ever_got_incoming(self):
    return self.everinc

①在 RawServer 中,当从外部发起的一个TCP成功建立后,调用此函数。
这里传递进来的参数 connection 是 SingleSocket 类型
def external_connection_made(self, connection):
创建一个 Connection 对象,加入到 connections 字典中。
    self.connections[connection] = Connection(self, connection, None, False)

  def connection_flushed(self, connection):
    c = self.connections[connection]
    if c.complete:
        self.connecter.connection_flushed(c)

关闭连接的时候调用此函数
  def connection_lost(self, connection):
    self.connections[connection].sever()
关闭一个连接之后,连接数量可能就没有达到“最大连接数”,所以如果 spares 中有一些等待建立的 ip ,现在可以取出来,主动向对方发起连接。
    while len(self.connections) < self.max_initiate and self.spares:
        self.start_connection(self.spares.pop(), None)

④某个连接上(无论该连接上主动建立还是被动建立的)有数据可读的时候,调用此函数。在 RawServer 中被调用。转而去调 Connection::data_came_in()。
  def data_came_in(self, connection, data):
    self.connections[connection].data_came_in(data) 
BT 4.0技术规范 蓝牙4.0技术规范,详细描述了BT4.0的协议栈架构和通讯规范,BLE工作模式,GATT协议等内容 立即下载

相关推荐

蓝牙4.0规范协议规范

下载下来后去掉pdf后缀,zip解压就好。密码1234

客户端源码分析之五:Encoder 类和 Connection 类

客户端源码分析之五:Encoder 类和 Connection 类作者:小马哥日期:2004-7-14版权所有,未经允许,不得随意转载email: rstevens2004 At yahoo.comEncoder 是一种 Handler 类(关于 Handler类,请参看前面的分析文章)。它在 download.py 中被初始化。它与 Connection类一起,完成“BT对等连接”的建立

2048

基于MATLAB的太阳能光伏电力仿真,模拟每日太阳能发电,可视化功率曲线,并通过数值积分计算总能量输出。.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

BT客户端源码分析

BT客户端源码分析之一:总述概述:相对于 tracker 服务器来说,BT客户端要复杂的多,Bram Cohen 花了一年 full time 的时间来完成 BT,我估计其中大部分时间是用在 BT 客户端的实现和调试上了。由于 BT 客户端涉及的代码比较多,我不能再象分析 tracker 服务器那样,走上来就深入到细节之中去,那样的话,我写的晕晕糊糊,大家看起来也不知所云。所以第一

坚持到底 2816

人脸识别签到考勤系统实战源码

这是一套可直接运行的人脸识别智能签到考勤系统,基于OpenCV YuNet人脸检测与SFace特征识别实现,全程本机运行,数据保存在本地SQLite,不上传任何服务器。配套交付完整Python源码、9章实战教程(md/html/pdf三种格式)、逐步骤操作截图和答辩PPT讲解。 系统围绕五个功能模块展开:人脸注册支持照片批量导入并提取特征入库;识别签到支持照片或摄像头两种方式,实时框出人脸并标注姓名、相似度与考勤状态;考勤规则引擎按config.py里配置的上下班时间与宽限分钟,自动判定迟到、早退、缺勤;Tkinter管理面板完成人员管理、流水查询与月度汇总;最后通过openpyxl一键导出整月考勤矩阵,正常绿、迟到黄、缺勤红,Excel打开即用。 选型上特意选了YuNet+SFace路线:纯pip安装免编译,CPU单帧识别不到100ms,两个ONNX模型共约37MB,出自OpenCV官方模型仓库,毕设报告引用有据可查。教程第7章整理了16条Windows下真实踩过的报错及排查方法,第8章给出换模型、换人脸、加功能的二次开发路径。 适合做计算机视觉方向毕设或课程设计的学生,也适合想给班级、实验室、小团队搭一套本地签到工具的Python学习者。运行环境为Python 3.9以上、Windows 10/11,不需要GPU。 使用时先pip install -r requirements.txt装齐依赖,再运行download_data.py下载模型,最后启动main.py即可进入图形界面;命令行register、recognize、report子命令也可脱离界面单独调用。

【无人机航测】MATLAB重叠率与地面分辨率协同设计:航线间距及飞行方向优化系统 MATLAB 无人机航测重叠率设计|地面分辨率与航线间距计算

内容概要:本文档介绍了基于MATLAB R2025b开发的无人机航测重叠率与航线间距计算系统,旨在通过建立统一的航测几何计算体系,实现重叠率、地面分辨率与航线间距的动态协同设计。系统结合相机参数、飞行参数、地形数据与风场信息,通过自动化候选航向搜索与多目标优化,选择兼顾覆盖质量、飞行效率与安全性的最优航线方向。项目涵盖从参数输入、摄影测量计算、地形与安全修正,到候选路线生成、综合评价与结果可视化的全流程,并构建了五万组模拟数据用于算法验证与模型训练,支持桌面交互、批量处理与服务化部署,适用于多种复杂场景下的无人机航测任务规划。 适合人群:具备一定MATLAB编程基础和摄影测量知识的科研人员、工程技术人员及高校师生,尤其适合从事无人机航测、地理信息系统(GIS)、遥感与测绘等相关领域的从业者。 使用场景及目标:① 实现无人机航测任务中地面分辨率与航线间距的精确计算与动态优化;② 解决复杂地形与风场环境下航线方向选择困难、覆盖质量难以保障的问题;③ 通过自动化设计减少人为经验依赖,提升航测任务的可靠性与效率;④ 为后续的三维建模、正射影像生成与灾害应急评估等应用提供高质量的数据基础。 阅读建议:建议读者结合文中提供的完整代码示例与GUI界面设计,逐步实践参数配置、模型计算与结果分析流程。重点关注摄影测量公式推导、地形修正策略与多目标优化算法的实现细节,并利用模拟数据进行敏感性分析与模型验证,以深入理解系统的设计理念与工程应用价值。

python进行TCP通信的一些注意事项

一般情况下 直接导入socket包,然后发送接收即可 self.connection.send(message) self.connection.recv(1024) 如果存在makefile 有时会涉及到一个socket.makefile(‘rwb’)的选项(目前也不知道相比直接用上述的方法有什么提高) self.connection = self.server_socket.makefile('rwb') 这时输入输出操作会有变化 self.connection.write(message) # 此时必

xufuqiang2017的博客 364

【电力负荷预测】项目介绍 MATLAB实现基于BO-Transformer-LSTM贝叶斯优化算法(BO)优化Transformer-LSTM组合模型进行居民用户多步电力负荷预测(含模型描述及部分示例

内容概要:本文介绍了一个基于BO-Transformer-LSTM的组合模型,用于实现居民用户多步电力负荷预测的完整项目实例。该模型融合Transformer的全局注意力机制与LSTM的局部时序记忆能力,构建能够捕捉长时依赖与周期性特征的深度学习架构,并引入贝叶斯优化(BO)自动搜索最优超参数组合,提升预测精度与训练效率。项目涵盖从原始数据清洗、特征工程、滑动窗口样本构建、模型设计到超参数优化、反归一化及多步误差评估的全流程,强调时间顺序划分以防止信息泄露,并通过周期编码、外生变量融合等方式增强数据表达能力。文中提供了详细的MATLAB代码示例,包括数据预处理、网络搭建、贝叶斯优化配置和预测结果评估等关键步骤。 适合人群:具备一定机器学习和时间序列分析基础,熟悉MATLAB编程环境,从事电力系统预测、智能电网、负荷管理等相关领域的研究人员、工程师及研究生。 使用场景及目标:①应用于居民级或多用户聚合负荷的短期至中期多步预测(如未来24小时);②服务于配电系统运行调度、需求响应基线设定、家庭能源管理系统优化、分布式能源协调控制等实际工程场景;③为科研提供可复现的深度学习+贝叶斯优化的技术路线参考。 阅读建议:此资源以实际项目为导向,建议读者结合提供的代码逐步实现并调试模型,重点关注数据质量控制、时间特征编码、组合网络结构设计与贝叶斯优化稳定性之间的协同关系,在实践中深入理解多步预测中的误差累积机制与超参数敏感性问题。

uTorrent的传输协议之BT-uTP

显示过滤参考:uTorrent的传输协议 协议字段名称: BT-UTP 版本: 1.6.0至1.8.3 返回显示过滤参考 字段名称 类型 描述 版本 BT-utp.ack_nr 2字节无符号整数, ACK NR 1.6.0到1.8.3 BT-utp.connection_id 4个字节无符号整数,

ReversalC的专栏 1万+

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

PotPlayer自用皮肤

自用 PotPlayer 皮肤,仅微调了字体大小与颜色,是按个人习惯调整,未做适配性调整。

BitTorrent 协议规范(翻译)

BitTorrent 是一种分发文件的协议。它通过URL来识别内容,并且可以无缝的和web进行交互。它基于HTTP协议,它的优势是:如果有多个下载者并发的下载同一个文件,那么,每个下载者也同时为其它下载者上传文件,这样,文件源可以支持大量的用户进行下载,而只带来适当的负载的增长。(译注:因为大量的负载被均衡到整个系统中,所以提供源文件的机器的负载只有少量增长) 一个BT文件分布系统由下列实体组成:

流水寿司的专栏 1773

2-shell及常用命令-续.pdf

2-shell及常用命令-续.pdf

超全Mathcad全桥LLC谐振变换器开关电源设计mathcad计算书

内容概要:本文介绍了“Plecs全桥LLC谐振变换器仿真模型”这一技术资源,该模型基于Plecs仿真平台构建,完整实现了全桥LLC谐振变换器的电路拓扑与控制系统,用于深入研究其在变频与移相混合控制策略下的动态行为。模型涵盖了软开关实现机制、谐振腔参数设计、功率传输特性、效率优化以及闭环控制策略等核心内容,支持对启动过程、负载突变、频率调节等工况的仿真分析,有助于全面掌握LLC变换器在高效率、高功率密度电源系统中的工作原理与设计方法。; 适合人群:具备电力电子技术基础、熟悉开关电源设计原理的研究生、硬件工程师及从事高频电源产品研发的技术人员。; 使用场景及目标:①用于高校教学与科研中对LLC谐振变换器运行机理的深入理解与验证;②辅助工程师在实际产品开发中进行关键参数设计、性能预测与优化;③支持对变频控制、软启动过程、零电压开关(ZVS)实现条件、负载调整率及系统稳定性等关键指标的仿真分析与验证。; 阅读建议:建议使用者具备Plecs或类似电力电子仿真软件的操作经验,结合经典电力电子教材与LLC设计指南进行学习,通过调整谐振元件参数、开关频率与负载条件,观察系统响应变化,以深化对谐振变换器非线性动态特性的理解,并建议将仿真结果与理论计算对照分析,提升工程设计能力。

【顶级EI复现】基于KKT条件与分段解析优化的双有源桥DC-DC变换器软开关协同最小应力闭环控制方法(Simulink仿真实现)

内容概要:本文详细介绍了一种基于KKT(Karush-Kuhn-Tucker)最优性条件与分段解析优化技术的双有源桥(DAB)DC-DC变换器闭环控制方法,旨在实现软开关条件下器件电压和电流应力的协同最小化,从而提升变换器的转换效率与系统可靠性。该方法通过建立精确的数学模型,结合KKT条件进行优化求解,并采用分段解析策略提高实时控制性能,在Simulink环境中完成了完整的闭环控制系统建模与仿真验证。作为“顶级EI复现”级别的研究成果,内容涵盖控制算法设计、优化机制分析、仿真架构搭建及结果对比,具有较强的理论深度与工程应用价值,适用于电力电子高频化、高效化发展的前沿研究方向。; 适合人群:面向具备电力电子、自动控制或电气工程等相关专业背景,熟悉Simulink仿真平台,且从事科研工作1年以上的研究生、博士生及科研人员;特别适合致力于DC-DC变换器拓扑优化、软开关技术、最小化开关应力控制、能量高效传输等领域研究的专业人士。; 使用场景及目标:① 复现高水平EI期刊论文中的先进优化控制算法;② 掌握KKT条件在非线性约束优化问题中的具体应用;③ 深入理解DAB变换器在不同工况下的软开关实现机制与应力抑制策略;④ 构建高精度仿真模型以支撑学术论文撰写、科研项目申报或实际工程系统的控制方案设计。; 阅读建议:建议结合提供的Simulink仿真模型同步学习,重点关注KKT条件推导过程与分段解析优化模块的实现逻辑。由于内容涉及较强的数学建模与优化理论,推荐具备扎实的电路理论、现代控制理论及数值优化基础后再行研读,并可参考同系列“顶级EI复现”资源以构建系统性知识体系。

交错并联图腾柱PFC变换器仿真设计(Simulink仿真实现)

内容概要:本文档系统性地介绍了基于Simulink平台的“交错并联图腾柱PFC变换器”仿真设计,聚焦于高效率功率因数校正技术的建模与实现。内容涵盖双闭环控制策略(电压外环与电流内环)、PI控制器设计、交错并联结构优化以及图腾柱拓扑的工作原理,旨在提升系统动态响应性能、降低输入电流谐波含量并改善功率因数。文档不仅提供详细的仿真模型构建流程,还配套Mathcad计算书用于参数设计与功率等级扩展,并列举了多种相关电力电子变换器的仿真案例,如三相维也纳整流器、LLC谐振变换器、双向Buck-Boost电路等,形成了一套完整的电力电子系统仿真资源体系,适用于从理论分析到工程实践的全流程学习与研究。; 适合人群:电气工程、自动化、电力电子及相关专业的高校本科生、研究生,以及从事新能源发电、电源设计、电能质量治理、工业自动化等领域的研发工程师;具备基本电路理论知识和Simulink/Matlab使用经验者更佳。; 使用场景及目标:①支持高校课程设计、毕业设计或科研项目中对先进PFC拓扑的仿真验证与性能优化;②帮助工程技术人员快速掌握图腾柱PFC的核心控制逻辑与建模方法,缩短产品开发周期;③作为电力电子系统教学与技术培训的标准化参考案例,强化理论与实践结合能力。; 其他说明:文档由“荔枝科研社”整理发布,所有资源可通过指定公众号或百度网盘链接获取,建议按照目录顺序系统学习,并结合提供的Mathcad计算书、参考文献及仿真文件进行参数验证与二次开发,以深化理解与应用能力。

game.c.docx

game.c.docx

激光雷达测距方式全解析:ToF、三角测距和FMCW到底怎么选?

本文深度解析激光雷达三种主流测距方式(ToF、三角测距和FMCW)的技术原理、环境适应性和成本模型,提供场景化选型决策指南。通过对比各技术在精度、抗干扰能力和维护成本等方面的表现,帮助工程师在自动驾驶、工业检测和消费电子等领域做出最优选择。

qqq44的博客 719
上一篇: BitTorrent 协议规范(BT协议集合)十六
下一篇: BitTorrent 协议规范(BT协议集合)十八
Pregunta
博客等级 码龄23年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值