飞鸽协议分析

IPMsg飞鸽传书--文件传输解析 这里继续讨论IPMSG飞鸽传书,前几天,详细的了解了IPMSG飞鸽传书的网络协议,详细分析并且实现了IPMSG飞鸽传书的消息传递过程,这里就IPMSG飞鸽传书中的文件和文件夹的传输做详细的说明。         在IPMSG 飞鸽传书中,如果要进行文件或者文件夹的传输,首先需要做的就是消息的应答,通过UDP发送文件传输报文,另外的IPMSG飞鸽传书客户端收到报文后,使用TCP协议发送应答报文,这 阅读详情

最近看到一些朋友在编写网络程序是遇到一些问题,故把以前做IPMSG时翻译的文档贴过来,希望对网络编程新手有所帮助,在寻找编程项目的同学们也可参照此文档写出自己的IPMSG。

本文只包含其中几个比较重要的命令以及运行机制的中文翻译,更详细的内容请参照文后的IPMSG 协议英文文档

声明:下述协议内容略去了一些在编写程序过程中没有用到协议内容,最初的Ipmsg协议是用日文写的,下面协议内容由本人(cugb_cat)翻译自Mr.Kanazawa的英文文档。本翻译文档可任意传播和使用。

        IP信使传输协议(第9版草案)         1996/02/21
                2003/01/14 修订

                H.Shirouzu
            shirouzu@h.email.ne.jp


关于IP信使:
  IP信使使用TCP/UDP协议提供收发消息及文件(目录)。
特性:
IP信使能够安装在任何一个安装了TCP/IP协议栈的操作系统上,使用在线用户的动态识别机制,可以和在线所有用户进行信息交换。
运行机制介绍:
使用TCP/UDP端口(默认端口为2425),消息的收发使用UDP协议,文件(文件夹)的收发使用TCP协议。
1、   命令字:
1)   基本命令字(32位命令字的低8位)
    IPMSG_NOOPERATION     不进行任何操作
    IPMSG_BR_ENTRY     用户上线
    IPMSG_BR_EXIT         用户退出
    IPMSG_ANSENTRY     通报在线
    IPMSG_SENDMSG         发送消息
    IPMSG_RECVMSG         通报收到消息
    IPMSG_GETFILEDATA     请求通过TCP传输文件
    IPMSG_RELEASEFILES   停止接收文件
    IPMSG_GETDIRFILES     请求传输文件夹
2)   选项位(32位命令字的高24位)
IPMSG_SENDCHECKOPT   传送检查(需要对方返回确认信息)
IPMSG_FILEATTACHOPT   传送文件选项
3)   附件类型命令(文件类型命令字的低8位)
IPMSG_FILE_REGULAR   普通文件
IPMSG_FILE_DIR     目录文件
IPMSG_FILE_RETPARENT   返回上一级目录
2、   数据包格式(使用字符串):
1)   数据包格式(版本1的格式)
版本号(1):包编号:发送者姓名:发送者主机名:命令字:附加信息
2)   举例如下
“1:100:shirouzu:Jupiter:32:Hello”
3、   数据包处理总述:
1)   用户识别
当IPMSG 启动时,命令IPMSG_BR_ENTRY被广播到网络中,向所有在线的用户提示一个新用户的到达(即表示“我来了”);所有在线用户将把该新上线用户添加到自己的用户列表中,并向该新上线用户发送IPMSG_ANSENTRY命令(即表示“我在线”);该新上线用户接收到IPMSG_ANSENTRY命令后即将在线用户添加到自己的用户列表中。
2)   收发消息
使用IPMSG_SENDMSG命令发送消息,消息内容添加在附加信息中;在接收消息时,如果对方要求回信确认(IPMSG_SENDCHECKOPT位打开),则需发送IPMSG_RECVMSG命令并将对方发送的数据包的编号放在附加信息中一同发送至发送消息方
3)   附加文件的扩充(添加于第9版)
带有IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG命令可用来传输文件,文件属性及内容添加在附加信息中,文件内容添加在消息内容后并以’/0’与之分隔开。传输文件时以下信息将被添加到消息内容之后(包括格式):文件序号:文件名:大小(单位:字节):最后修改时间:文件属性[: 附加属性=val1[,val2…][:附加信息=…]]:/a:文件序号…
(文件大小、最后修改时间和文件属性为十六进制数,如果文件名中包含’:’则使用“::”代替)。
接收端开始接收文件时,请求传输文件命令IPMSG_GETFILEDATA将发送到发送端的TCP端口(和UDP的发送端口相同),并将发送端发送的包编号:文件序号:偏移量(全为十六进制格式)写到附加信息区一同发送,文件发送端接收到该请求信息并进行校验正确后即开始发送文件(不使用任何格式,亦不进行加密)。
当接收端接收到目录文件时,将发送附加信息区为发送端发送的包编号:文件序号:偏移量(全为十六进制格式)的 IPMSG_GETDIRFILES命令,以用来请求传输目录文件;发送端则将头信息长度:文件名:文件大小:文件属性:文件内容添加到附加信息区(除了文件名和文件内容外,其余皆为十六进制),头信息长度是从头信息长度开始到文件内容前的‘:’分割符为止的字符个数。
当文件属性为IPMSG_FILE_DIR时,IPMsg能够自动识别其为目录,下一个文件的数据在该目录之后。
当文件属性为IPMSG_FILE_RETPARENT时,IPMsg识别其动作为返回上一级目录,在这种情况下,文件名为‘.’其属性为当前目录的值。

附IPMSG协议英文版:


QUOTE:
Original ipmsg protocol specification is written in Japanese.
This document was translated by Mr.Kanazawa.
This document is not verified yet.

----------------------------------------------------------------------
    IP Messenger communication protocol (Draft-9)   1996/02/21
                                Modified 2003/01/14

                                    H.Shirouzu
                              shirouzu@h.email.ne.jp
----------------------------------------------------------------------

About IP Messenger
    This is a Send/Receive message service using the TCP/UDP Port.

Characteristics
    IP Messenger can be installed in any OS if TCP/IP is used on your machine.
    Dynamic member recognition can be done within your network or specified network.
    You can exchange messages between all IPMsg members.

Function description
    Use TCP/UDP port(default:2425). See the following descriptions
    (Message Send/Receive: UDP, File Send/Receive: TCP)

1. Command

  1) Command functions (Low 8 bits from command number 32 bits)

    IPMSG_NOOPERATION     No Operation
    IPMSG_BR_ENTRY           Entry to service (Start-up with a Broadcast command)
    IPMSG_BR_EXIT           Exit from service (End with a Broadcast command)
    IPMSG_ANSENTRY           Notify a new entry
    IPMSG_BR_ABSENCE     Change absence mode

    IPMSG_BR_ISGETLIST     Search valid sending host members
    IPMSG_OKGETLIST           Host list sending notice
    IPMSG_GETLIST           Host list sending request
    IPMSG_ANSLIST           Host list sending

    IPMSG_SENDMSG           Message transmission
    IPMSG_RECVMSG           Message receiving check

    IPMSG_READMSG           Message open notice
    IPMSG_DELMSG           Message discarded notice
    IPMSG_ANSREADMSG     Message open confirmation notice(added from version-8 )

    IPMSG_GETFILEDATA     File Transfer request by TCP
    IPMSG_RELEASEFILES     Discard attachment file
    IPMSG_GETDIRFILES     Attachment hierarchical file request

    IPMSG_GETINFO           Get IPMSG version info.
    IPMSG_SENDINFO           Send IPMSG version info.

    IPMSG_GETABSENCEINFO     Get absence sentence
    IPMSG_SENDABSENCEINFO     Send absence sentence

    IPMSG_GETPUBKEY           RSA Public Key Acquisition
    IPMSG_ANSPUBKEY           RSA Public Key Response

  2) Option flag (High 24 bits from command number 32 bits)

    IPMSG_ABSENCEOPT     Absence mode(Member recognition command)
    IPMSG_SERVEROPT           Server(Reserved)
    IPMSG_DIALUPOPT           Send individual member recognition command

    IPMSG_SENDCHECKOPT     Transmission check
    IPMSG_SECRETOPT           Sealed message
    IPMSG_READCHECKOPT     Sealed message check(added from ver8 )
    IPMSG_PASSWORDOPT     Lock
    IPMSG_BROADCASTOPT     Broadcast message
    IPMSG_MULTICASTOPT     Multi-cast(Multiple casts selection)
    IPMSG_NEWMUTIOPT     New version multi-cast(reserved)
    IPMSG_AUTORETOPT     Automatic response(Ping-pong protection)
    IPMSG_NOLOGOPT           No log files
    IPMSG_NOADDLISTOPT     Notice to the members outside of BR_ENTRY

    IPMSG_FILEATTACHOPT     File attachment
    IPMSG_ENCRYPTOPT     Code

    IPMSG_NOPOPUPOPT     (No longer valid)
    IPMSG_RETRYOPT           Re-send flag(Use when acquiring HOSTLIST)

  3) Extended code flag (hex format combination)

    IPMSG_RSA_512
    IPMSG_RSA_1024
    IPMSG_RSA_2048
    IPMSG_RC2_40
    IPMSG_RC2_128
    IPMSG_RC2_256
    IPMSG_BLOWFISH_128
    IPMSG_BLOWFISH_256
    IPMSG_SIGN_MD5

  4) Extended files for attachment (fileattr low 8 bits)

    IPMSG_FILE_REGULAR
    IPMSG_FILE_DIR
    IPMSG_FILE_RETPARENT
    IPMSG_FILE_SYMLINK
    IPMSG_FILE_CDEV
    IPMSG_FILE_BDEV
    IPMSG_FILE_FIFO
    IPMSG_FILE_RESFORK

  5) Attachment file extended attribute(fileattr high 24 bits)

    IPMSG_FILE_RONLYOPT
    IPMSG_FILE_HIDDENOPT
    IPMSG_FILE_EXHIDDENOPT
    IPMSG_FILE_ARCHIVEOPT
    IPMSG_FILE_SYSTEMOPT

  6) Extended file attribute for attachment file

    IPMSG_FILE_UID
    IPMSG_FILE_USERNAME
    IPMSG_FILE_GID
    IPMSG_FILE_GROUPNAME
    IPMSG_FILE_PERM
    IPMSG_FILE_MAJORNO
    IPMSG_FILE_MINORNO
    IPMSG_FILE_CTIME
    IPMSG_FILE_MTIME
    IPMSG_FILE_ATIME
    IPMSG_FILE_CREATETIME

    IPMSG_FILE_CREATOR
    IPMSG_FILE_FILETYPE
    IPMSG_FILE_FINDERINFO

    IPMSG_FILE_ACL
    IPMSG_FILE_ALIASFNAME
    IPMSG_FILE_UNICODEFNAME


2.Command format(Use all character strings)

  1) Command(Format version-1)

    Ver(1) : PacketNo : SenderName : SenderHost : CommandNo : AdditionalSection

  2) An example for Message Send/Receive by using the current command format

    "1:100:shirouzu:jupiter:32:Hello"


3.Command process overview

  1) Member recognition

    An IPMSG_BR_ENTRY command notifies a new entry to the current
    members at start-up.

    All members add the new member to their list after getting a notification message.
    An IPMSG_ANSENTRY command sends a message back to the new member.

    The new member gets the current member data by a
    IPMSG_ANSENTRY command. All members can communicate as long as an
    IP packet exists.

    An IPMSG_BR_ABSENCE command broadcasts absence mode cancel or
    nickname change to all members. However, an IPMSG_ANSENTRY command
    does not send a message back, which is different from an IPMSG_BR_ENTRY
    command.

    IPMSG_BR_ENTRY, IPMSG_ANSENTRY, and IPMSG_BR_ABSENCE commands
    use an IPMSG_ABSENCEOPT flag for absence mode. Input a nickname to
    additional command.
    Add an IPMSG_DIALUPOPT flag for dial-up users who can't be reached by
    a broadcast command. A member recognition command needs to be
    sent individually to the members with this optional flag.

    (Extended group)IPMSG_BR_ENTRY and IPMSG_BR_ABSENCE commands
    sends a group name by adding the new group name after the current
    command format character strings (Input '/0' between the current
    command and extended name).

  2) Send/Receive Message
    Send Message uses an IPMSG_SENDMSG command that can input a message
    in the extended area.
    Receive Message sends back an IPMSG_RECVMSG command only
    if an IPMSG_SENDCHECKOPT flag is ON. Input the original packet number
    to the extended area.

    Broadcast Message Send uses an IPMSG_BOADCASTOPT command
    and an IPMSG_SENDMSG flag should be ON.
    Auto-Send packet(absence notice) needs to be added to IPMSG_AUTORETOPT
    for ping-pong protection. If either one or another packet is ON, then
    confirmation/auto-send packet is not sent back.

    Send Message Sealing needs to be an IPMSG_SECRETOPT packet ON.
    In this case, Receive Message sends an IPMSG_READMSG command.
    Input the original packet number to the extended area.

    (Additional IPMSG_NOADDLISTOPT)
    When receiving an IPMSG_SENDMSG packet from a host that is
    not on your Send/Receive list, IPMsg will either confirm a host by
    sending an IPMSG_BR_ENTRY command or add a host name to
    the Send/Receive list.
    However, single-shot Message Send/Receive action needs to be avoided.
    Add an IPMSG_NOADDLISTOPT flag to an IPMSG_SENDMSG command.

    (Additional IPMSG_READCHECKOPT from version-8 )
    When an IPMSG_READMSG command contains an IPMSG_READCHECKOPT flag,
    IPMsg process is the same as IPMSG_SENDMSG with an
    IPMSG_SENDCHECKOPT flag.
    However, Send Message uses an IPMSG_ANSREADMSG command,
    not IPMSG_RECVMSG.

  3) Message Send/Receive 亅encrypted extension (Added in the version-9 )

    Use the combination of Public-key(RSA) and common key(RC2/Blowfish).
    (Encrypted extension area is used in hex format.)

    (Public key acquisition)Send an IPMSG_GETPUBKEY command to Receive
    Message. Receive Message gets an IPMSG_ANSPUBKEY that
    means receiving RSA public key from Send Message.

    IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY both require the value which is
    encryption capability (Exp. IPMSG_RSA_1024) flag uses "OR" at first
    part of extension

    In addition, In IPMSG_ANSPUBKEY, public key written as EE-NNNNNN
    E=Exponent丄N=method)devide by ':'. and Input the Fdelimiter '-'
    between E and N.

    This sequence can be skipped after the 2nd Send/Receive process by
    memorizing public key and encrypted data.
  
    (Encrypted message)After a sender creates a common key that is
    supported both sender and receiver, a common key can encrypt a message.
    In addition, a receiver's public key encrypts the common key.


    (Encrypted message transmission) IPMSG_ENCRYPTOPT is used in
    IPMSG_SENDMSG. At the first part of extension, input the value which
    is 'or' resoult from Convination of public key and common key type .
    Then use common key which encrypt with public key devide by ':'.
    Then input message which is eccrypted by public key devide by ':'.
    If both supports IPMSG_SIGN_XXX, then add ':' and signeture.

    Also, In the method of encode padding, PKCS#1ECB key is used for RSA,
    PKCS#5 CBC common key is used for RC2/blowfish.

    Also, The Packet related to Entry manifestation the capability of
    ecryption support using IPMSG_ENCRYPTOPT

  4) Extension with file attachment(Available from version-9 )

    An IPMSG_SENDMSG command with an IPMSG_FILEATTACHOPT flag for
    File transfer (download permission)notification sends a message
    with attachment.
    Input '/0' after the message and attachment file data.
  

    fileID:filename:size:mtime:fileattr[:extend-attr=val1
    [,val2...][:extend-attr2=...]]:/a:fileID...
    (size, mtime, and fileattr describe hex format.
      If a filename contains ':', please replace with "::".)

    When Receive Message downloads an attachment file, an IPMSG_GETFILEDATA
    command requests a data transmission packet to the TCP port that is the same number
    as the UDP sending port number. Input packetID:fileID: offset to the extended area.
    (Use all hex format.)
    File Transfer side receives the request. After recognizing that it's a correct request,
    then send the specified data (no format)

    When the data receiving side downloads a hierarchical attachment file,
    use an IPMSG_GETDIRFILES command and input a packetID:fileID
    to the extended area and send a data transmission request packet.
    (all hex format)

    Data sending side sends the following hierarchical data format.
    header-size:filename:file-size:fileattr[:extend-attr=val1
    [,val2...][:extend-attr2=...]]:contents-data
    Next headersize: Next filename...
    (All hex format except for filename and contetns-data)

    header-size is from the beginning of header-size to the delimiter ':'
    that is before contents-data. extend-attr can be omitted and used multiple
    extended attributes. Use '=' for data input.

    When fileattr is IPMSG_FILE_DIR, IPMsg recognizes that it is automatically
    in the directory, the next file data is after the directory.

    When fileattr is IPMSG_FILE_RETPARENT, IMPsg recognizes that it returns
    to the parent directory. In this case, File name is always "." and the attribute
    value is the current directory data.

    Sending process starts from the attachment directly and returns the
    IPMSG_FILE_RETPARENT command to the attachment directory.

    Add an IPMSG_FILEATTACHOPT flag for an Entry packet to support the
    attachment file.

  5) Other commands

    When acquiring different versions, send an IPMSG_GETINFO command.
    Receiving side sends the version information character string to
    extended area.

    Send an IPMSG_GETABSENCEINFO command for acquiring an absence message.
    Receiving side sends an IPMSG_SENDABSENCEINFO back if the status is absence mode.
    If the status is not absence mode, a character string "Not absence mode" will be sent back.

  6) Confirmation/Retry

    If a confirmation packet for IPMSG_SENDMSG or IPMSG_RECVMSG is not delivered
    within a specified time, then it will be sent again.
    A number of retry actions or interval period is depended on the current condition.


4. Other

  1) Linefeed

    Linefeed characters in Send Message is standardized with UNIX type ('0x0a').
    Please change if needed.

  2) Delimiter ':'

    ':' is used as a delimiter. You can't use this delimiter for user name
    and host name.
    If the use/host names contain a ':', please replace with another sign,
    for an example ';'.
    Although using this delimiter isn't problem as yet, I may create an
    escape sequence.
  

  3) Kanji codes

    SJIS


5. Contact e-mail address

    E-Mail shirouzu@h.email.ne.jp


Note
    See ipmsg.h for command codes.
    Please e-mail me your comments and suggestions.

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/eroswang/archive/2007/12/04/1916721.aspx

飞鸽协议分析之上下线报文分析 最近在研究飞鸽协议。飞鸽的上下线的原理很简单,就是,当第一次上线时,会在局域网内广播一条消息,所有在线的飞鸽用户在收到广播的上线消息后,都要回复一条消息,这样,就完成了新上线用户和已上线用户的用户列表的更新,也就是都有了相互的信息。而下线时,则广播一条下线消息,接收方在收到后,将相应的用户从用户列表中删除。      由于飞鸽版本众多,比如飞秋,同是飞秋团队所写的飞鸽传书等等,经过分析发现,具体 阅读详情

相关推荐

飞鸽协议分析之上下线报文分析之二

上一篇的飞鸽协议上下线报文分析,写的比较乱,并且其中有些分析还是有点出入。最近我又针对飞鸽协议做了详细的抓包分析,特此这一篇中对上下线报文做一个总结,其中也讲解了发送消息的一些内容。有关聊天报文和文件传输报文,以后我会在分析的比较透彻以后写出技术分析文章。 这里纠正上一篇中的一个错误,就是针对飞秋报文和飞鸽报文差异的那部分,经过我的分析后,发现飞秋的报文和飞鸽的报文基本上是一致的,飞秋的定制信息

ccf的专栏 3258

IPMsg的使用

机房拷贝大文件,IPMsg比硬盘都方便好用。(PS:今天用两个硬盘拷贝40g的镜像文件到学生机,最后五分钟,全卡顿了,在朋友的推荐下,果断用IPMsg) IPMsg的使用步骤如下: Step1:双击可执行文件。 (PS:如果是32位操作系统的话,双击IPMsg.3.5.0.x86.chs.th_sjy.exe; 如果是62位操作系统的话,双击IPMsg.3.5.0.x64...

weixin_42773514的博客 9018

嵌入式开发从入门到精通之第二十五节:IPMSG协议

飞鸽传书

产品线负责人 837

Ipmsg

目录1 功能介绍2 源码简介3 自述文件(readme)4 版本差异5 软件截图6 相关资源<br /> 飞鸽传书主界面ipmsg全称:IP Messenger,中文名为“飞鸽传书”,是一款由一个名叫H.Shirouzu的日本人开发和维护的用C语言写的局域网聊天和文件传输工具。后来发展为很多志愿者共同开发多种版本。它是一个小巧方便的即时通信软件,它适合用于局域网内甚至广域网间进行实时通信和文档共享。特别是在局域网内传送文件/文件夹的效率很高。它具有很多优点,如数据通讯不需要建立服务器、直接在两台电脑间通信和

asli33的专栏 6137

ipmsg协议详细笔记

记录ipmsg协议详细交互过程,帮助理解ipmsg协议解析

强化学习-----DQN(Deep Q-network)

DQN(Deep Q-Network)是一种基于深度学习和强化学习的算法,由DeepMind提出,用于解决离散动作空间下的马尔科夫决策过程(MDP)问题。它是首个成功将深度学习应用于解决强化学习任务的算法之一。DQN,即深度Q网络(Deep Q-network),是指基于深度学习的Q-Learing算法。那什么是Q-leaning?可以看上一篇文章Q-learning是一种经典的强化学习算法,用于解决马尔可夫决策过程(Markov Decision Process,MDP)中的控制问题。

qq_74722169的博客 2万+

飞鸽传书协议分析

 在每 30 秒一次的 ipmsg 飞鸽传书更新中向其它飞鸽传书器通告该指定网络。注: 如果您输入子网地址,SOFT 会自动将其转换到有类网络地址。例如,如果您输入命令 network 192.168.1.32,飞鸽传书器将把它转换为 network 192.168.1.0。强大的故障排除命令要检验飞鸽传书和排除飞鸽传书故障,请首先使用 show ip ipmsg 和 protocols。如果

小发猫 2231

腾讯云TDSQL MySQL版 - 开发指南兼容性

语言结构 分布式实例支持所有 MySQL 使用的文字格式,包括: String Literals Numeric Literals Date and Time Literals Hexadecimal Literals Bit-Value Literals Boolean Literals NULL Values String Literals String Literals 是一个 bytes 或者 characters 的序列,两端被单引号'或者双引号"包围,TDSQL MySQL版

weixin_43872058的博客 909

飞鸽---局域网聊天软件攻防战

0×00 前言 笔者发现不少甲方公司的办公网络依靠五花八门的局域网聊天软件进行办公通信,而这些软件中同样存在各种安全风险。本文就带大家利用协议分析技术来还原一款局域网聊天软件的通信协议,并对其进行简易攻击。 0×01 协议分析 网络协议是指计算机网络中通信双方必须共同遵守的一组约定,这些约定包括数据传输格式和顺序等内容,它最终体现为在网络上传输的数据包的格式,只有双方遵守相关约定才...

weixin_30394251的博客 384

STM32F407与AD7766实战:如何用SPI+DMA实现高速ADC数据采集(附完整代码)

本文详细介绍了如何利用STM32F407的SPI接口与DMA控制器,高效稳定地驱动24位高精度ADC芯片AD7766,实现高速连续数据采集。通过对比传统中断方式的瓶颈,阐述了SPI+DMA方案如何大幅降低CPU负载,并提供了从硬件设计、CubeMX配置到核心驱动代码的完整实战指南,帮助工程师解决高速ADC数据采集中的性能难题。

weixin_29281941的博客 188

深入解析AndroidManifest.xml与device_admin.xml:打造完美DeviceOwner应用配置

本文深入解析了Android企业级开发中DeviceOwner应用的核心配置文件AndroidManifest.xml与device_admin.xml。详细阐述了如何精准声明DeviceAdminReceiver、定义管理策略,并提供了通过ADB命令进行设置与验证的实战指南,帮助开发者构建权限完整、配置正确的设备所有者应用。

ice55的博客 680
上一篇: C# 采用系统委托的方式处理线程内操作窗体控件
下一篇: Linux下IPMSG的实现
vrix
博客等级 码龄24年 673粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值