关于网络编程方面VB的WINSOCK编程

VB6 Winsock网络编程项目实战 本文还有配套的精品资源,点击获取 简介:VB6是一个经典的Windows应用程序开发环境,Winsock是用于实现TCP/IP通信的网络接口。本文档展示了如何在VB6中使用Winsock控件创建基础的网络聊天应用和文件信息交换程序。通过server和client示例文件,读者可以学习到Winsock控件的关键使用方法、网络连接建立、数据传输、事件驱动编程、以及多线程处理等重... 阅读详情
VB网络编程--WinSock控件及WinSockAPI

一,WinSock简介
Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX妈作系统开发的网络通信接口,随着UNIX的广泛使 用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。

VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI


二,WinSock控件的使用
1.WinSock控件的主要属性
a.Protocol属性
通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是 sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建 立或断开连接后。

b.SocketHandle属性
SocketHandle返回当前socket连接的句柄,这是只读属性。

c.RemoteHostIP属性
RemoteHostIP属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了 RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是 UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。

d.ByteReceived属性
返回当前接收缓冲区中的字节数

e.State属性
返回WinSock控件当前的状态

常数 值 描述
sckClosed 0 缺省值,关闭。
SckOpen 1 打开。
SckListening 2 侦听
sckConnectionPending 3 连接挂起
sckResolvingHost 4 识别主机。
sckHostResolved 5 已识别主机
sckConnecting 6 正在连接。
sckConnected 7 已连接。
sckClosing 8 同级人员正在关闭连接。
sckError 9   错误


2.WinSock主要方法
a.Bind方法
用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。

b.Listen方法
Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。

c.Connect方法
当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。
Connect方法调用的规范为:
Connect RemoteHost,RemotePort

d.Accept方法
当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。

e.SendData方法
当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。

f.GetData方法
当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。GetData方法调用规范如下:
GetData data,[type,][maxLen]
它从缓冲区中取得最长为maxLen的数据,并以type类型存放在data中,GetData取得数据后,就把相应的缓冲区清空。

g.PeekData方法
和GetData方法类似,但PeekData在取得数据后并不把缓冲区清空。


3.Winsock控件主要事件

a.ConnectRequest事件
当本地计算机接收到远程计算机发送的连接请求时,控件的ConnectRequest事件将会被触发。

b.SendProgress事件
当一端的计算机正在向另一端的计算机发送数据时,SendProgress事件将被触发。SendProgress事件记录了当前状态下已发送的字节数和剩余字节数。

c.SendComplete事件
当所有数据发送完成时,被触发。

d.DataArrival事件
当建立连接后,接受到了新数据就会触发这个事件。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。

e.Error事件
当在工作中发生任何错误都会触发这个事件。

例子见附件



三,WinSockAPI的使用

1.WSAStartup 函数

为了在你的应用程序当中调用任何一个Winsock API 函数,首先第一件事情你就是必须通过WSAStartup函数完成对Winsock 服务的初始化,因此需要调用WSAStartup函数。

Declare Function WSAStartup Lib "ws2_32.dll" _
(ByVal wVersionRequired As Long, lpWSAData As WSAData) As Long

这个函数有两个参数: wVersionRequired 和 lpWSAData。wVersionRequired 参数定义Windows Sockets 提供能使用的最高版本,它的高位字节定义的是次版本号,低位字节定义的是主版本号。下面的2个Winsock版本在VB中使用的例子:

初始化1.1版本

lngRetVal = WSAStartup(&H101, udtWinsockData)


初始化2.2版本

lngRetVal = WSAStartup(&H202, udtWinsockData)


第二个参数是WSADATA 的数据结构 ,它是接收Windows Sockets 执行时的数据。

Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription As String * WSADESCRIPTION_LEN
szSystemStatus As String * WSASYS_STATUS_LEN
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End Type

数据成员的描述在下表中:

Field 描述
wVersion Windows Sockets 版本信息。
wHighVersion 通过加载库文件得到的最高的支持Winsock 的版本,
它通常和wVersion值相同。
szDescription Windows Sockets 执行时的详细描述
szSystemStatus 包含了相关的状态和配置的信息
iMaxSockets 表示同时打开的socket最大数,为0表示没有限制。
iMaxUdpDg 表示同时打开的数据报最大数,为0表示没有限制。
lpVendorInfo 厂商指定信息预留

在 Winsock的1.1和2.2版本中没有lpVendorInfo的返回值。因为winsock 2支持多个传输协议,所以iMaxSockets 和iMaxUdpDg只能在仅支持TCP/TP的winsock1.1中使用。为了在Winsock 2中获得这些值,你可以使用WSAEnumProtocols 函数。

如果成功或者返回一个错误代码,则函数返回 0。

错误代码 含义
WSASYSNOTREADY 指出网络没有为传输准备好。
WSAVERNOTSUPPORTED 当前的WinSock实现不支持应用程序指定的Windows Sockets规范版本
WSAEINPROGRESS 一个阻塞WinSock调用正在进行
WSAEPROCLIM 请求的协议没有在系统中配置或没有支持它的实现存在。
WSAEFAULT lpWSAData 不是有效的指针



2.WSACleanup 函数

每次调用了WSAStartup函数,你都需要调用WSACleanup函数,通知系统来卸载库文件及清除已分配的资源,这个函数十分简单,没有任何参数:

Declare Function WSACleanup Lib "ws2_32.dll" () As Long


3.建立Socket函数

Declare Function socket Lib "ws2_32.dll" (ByVal af As Long, _
ByVal s_type As Long,
ByVal Protocol As Long) As Long

函数有3个参数定义建立何种socket,三个参数分别是:
Argument Description Enum Type
af Address family specification. AddressFamily
s_type Type specification for the new socket. SocketType
Protocol Protocol to be used with the socket SocketProtocol
that is specific to the indicated address
family.

AddressFamily:
AF_UNSPEC = 0 '/* unspecified */
AF_UNIX = 1 '/* local to host (pipes, portals) */
AF_INET = 2 '/* internetwork: UDP, TCP, etc. */
AF_IMPLINK = 3 '/* arpanet imp addresses */
AF_PUP = 4 '/* pup protocols: e.g. BSP */
AF_CHAOS = 5 '/* mit CHAOS protocols */
AF_NS = 6 '/* XEROX NS protocols */
AF_IPX = AF_NS '/* IPX protocols: IPX, SPX, etc. */
AF_ISO = 7 '/* ISO protocols */
AF_OSI = AF_ISO '/* OSI is ISO */
AF_ECMA = 8 '/* european computer manufacturers */
AF_DATAKIT = 9 '/* datakit protocols */
AF_CCITT = 10 '/* CCITT protocols, X.25 etc */
AF_SNA = 11 '/* IBM SNA */
AF_DECnet = 12 '/* DECnet */
AF_DLI = 13 '/* Direct data link interface */
AF_LAT = 14 '/* LAT */
AF_HYLINK = 15 '/* NSC Hyperchannel */
AF_APPLETALK = 16 '/* AppleTalk */
AF_NETBIOS = 17 '/* NetBios-style addresses */
AF_VOICEVIEW = 18 '/* VoiceView */
AF_FIREFOX = 19 '/* Protocols from Firefox */
AF_UNKNOWN1 = 20 '/* Somebody is using this! */
AF_BAN = 21 '/* Banyan */
AF_ATM = 22 '/* Native ATM Services */
AF_INET6 = 23 '/* Internetwork Version 6 */
AF_CLUSTER = 24 '/* Microsoft Wolfpack */
AF_12844 = 25 '/* IEEE 1284.4 WG AF */
AF_MAX = 26

Socket types:
SOCK_STREAM = 1 ' /* stream socket */
SOCK_DGRAM = 2 ' /* datagram socket */
SOCK_RAW = 3 ' /* raw-protocol interface */
SOCK_RDM = 4 ' /* reliably-delivered message */
SOCK_SEQPACKET = 5 ' /* sequenced packet stream */

Protocols:
IPPROTO_IP = 0 '/* dummy for IP */
IPPROTO_ICMP = 1 '/* control message protocol */
IPPROTO_IGMP = 2 '/* internet group management protocol */
IPPROTO_GGP = 3 '/* gateway^2 (deprecated) */
IPPROTO_TCP = 6 '/* tcp */
IPPROTO_PUP = 12 '/* pup */
IPPROTO_UDP = 17 '/* user datagram protocol */
IPPROTO_IDP = 22 '/* xns idp */
IPPROTO_ND = 77 '/* UNOFFICIAL net disk proto */
IPPROTO_RAW = 255 '/* raw IP packet */
IPPROTO_MAX = 256


该函数可以建立使用特定协议的网络套接字,例如对于UDP协议可以这样写:
s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)



4.关闭Socket函数

Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long

函数有一个参数为建立socket时的Handle




5.连接函数

Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, _
ByRef name As sockaddr_in, _
ByVal namelen As Long) As Long

参数

s 连接的socket句柄。

name 建立连接的地址。

namelen 连接地址的长度。

返回值

成功时返回0。否则返回SOCKET_ERROR以及一个对应的错误号 Err.LastDllError。

显 然在调用这个函数时我们需要知道socket句柄,将连接的电脑的端口号和主机名称(或主机IP地址)。我们知道Winsock 控件的Connect方法依靠两个变量:RemoteHost 和RemotePort。此方法不需要socket句柄,因其已经被封装在COM对象中。你也许认为connect函数应该也接受相同的变量设置,然而, 事实并非如此。connect函数的主机地址和端口号的传送是依靠 sockaddr_in 结构。

Public Type sockaddr_in
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero(1 To 8) As Byte
End Type




6.套接字帮定函数

Declare Function bind Lib "ws2_32.dll" (ByVal s As Long, _
ByRef name As sockaddr_in, _
ByRef namelen As Long) As Long



s是使用Socket函数创建好的套接字,name指向描述通信对象的结构体的指针,namelen是该结构的长度。该结

构体中的分量包括:
IP地址:对应name.sin_addr.s_addr

端口号:对应name.sin_port
端口号用于表示同一台计算机上不同的进程(即应用程序),其分配方法有两种:
第一种分配方法是,进程让系统为套接字自动分配一端口号,这只要在调用bind前将端口号指定为0即可。由系统自动分配的端口号位于1024~5000之 间,而1~1023之间的任一TCP或UDP端口都是保留的,系统不允许任一进程使用保留端口,除非其有效用户ID是零(即超级用户)。
第二种分配方法是,进程为套接字指定一特定端口。这对于需要给套接字分配一众所周知的端口的服务器是很有用的。指定范围在1024~65536之间。

地址类型:对应name.sin_family,一般都赋成AF_INET,表示是internet地址(即IP 地址)。IP地址通常使用点分表示法表示,但它事实上一个32位的长整数,这两者之间可通过inet_addr()函数转换。


7.套接字监听函数

Declare Function listen Lib "ws2_32.dll" (ByVal s As Long, ByVal backlog As Long) As Long

listen函数用来设定Socket为监听状态,这种状态表明Socket准备被连接了。注意,此函数一般在服务程序上使用,其中s是使用Socket函数创建好的套接字,backlog参数用于设定等待连接的客户端数。



8.接受连接请求

Declare Function accept Lib "ws2_32.dll" (ByVal s As Long, ByRef addr As sockaddr_in, _
ByRef addrlen As Long) As Long


服务端应用程序调用此函数来接受客户端Socket连接请求,accept()函数的返回值为一新的Socket,新Socket就可用来完成服务端和客户端之间的信息传递与接收,而原来Socket仍可以接受其他可户端的连接请求。



9.接收信息

Declare Function recv Lib "ws2_32.dll" (ByVal s As Long, _
ByRef buf As Any, _
ByVal buflen As Long, _
ByVal flags As Long) As Long


s 一个已连接的socket的识别符
buf 接受到的数据的缓冲区
len 缓冲区长度
flags 指定从哪调用的标识

第一个参数是socket的句柄-为socket函数返回值。那就是说:我们需要告诉recv函数,哪一个socket正访问函数。

第 二个参数是:函数执行之后能装载一些数据的缓冲区。但它不是必须要有足够的长度接收Winsock缓冲区的所有数据,缓冲区的大小限制为8192 字节 (8 Kbytes)。因此如果Winsock缓冲区的数据的大小大于recv函数的缓冲区,你必需多次调用此函数,直到获取所有的数据。

如果应用程序定义缓冲区的长度,则recv函数必须知道缓冲区可以存放多少字节。第三个参数就是为了这个目的。

最后一个参数是可选的,今天我们不使用。该参数有两个选择标志: MSG_PEEK 和 MSG_OOB,用于改变函数的行为。

MSG_PEEK 从输入数据中取数。数据拷入缓冲区,但不从输入队列中移走。函数返回当前准备接收的字节数。
MSG_OOB 处理OOB(Out-of-band带外)数据。在网络上有两种类型的数据包,正常包和带外包。带外包可以通过检验一个TCP/IP包头的一个特定标志来决定。



10.发送信息

Declare Function send Lib "ws2_32.dll" (ByVal s As Long, _
ByRef buf As Any, _
ByVal buflen As Long, _
ByVal flags As Long) As Long


参数参看接收信息




四,服务器与客户机交互

目前最常用的方法是:服务程序在一个众所周知的地址(其中包括端口信息)监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务 的地址提出了连接请求。这个时刻,服务程序被唤醒并对客户的请求作出适当的反应。注意,服务器与客户机之间的交互可以是面向连接的(基于流套接字),也可 以是无连接的(基于数据报套接字)
五,其他

比较:WinSock控件
优点:使用简单,工作量小。
缺点:功能少仅支持TCP,UDP协议,需要WinSock控件(系统默认安装不带MSWINSCK.OCX文件)
适合于初学者
WinSockAPI
优点:功能强大,支持多种协议,使用灵活,WinSockAPI调用的wsock32.dll(28K)或ws2_32.dll(69K)为Windows系统自带函数库不必担心缺少文件。
缺点:使用复杂,编程量大,需要一定基础
适合于要求较高的网络程序
VB WinSock 实例:完整的聊天应用程序设计 在现代网络应用中,VB(Visual Basic)语言虽然不如之前那样风靡,但其WinSock组件仍是一个强大的工具,用于实现基于Windows平台的网络通信功能。VB WinSock组件基于Windows Sockets API,它允许VB应用程序连接到网络,发送和接收数据。本章我们将介绍WinSock组件的基础知识,为后续章节深入探讨VB网络编程和TCP/IP协议的应用打下基础。 阅读详情

相关推荐

VB单机TCP/IP通信实现教程

网络通信协议是一套规则和约定,用于控制设备间的通信过程。它定义了数据如何在网络中传输、寻址、寻址以及如何处理错误等。协议保证了不同设备之间能够有序、准确地交换信息。OSI(开放系统互连)模型是一个理论上的七层框架,用于标准化网络通信。每一层负责一部分特定功能。TCP/IP协议族以简化的四层模型实现,包括链路层、网络层、传输层和应用层。Winsock控件是一个封装好的网络通信组件,主要用于在Visual Basic应用程序中实现网络通信。

weixin_42561464的博客 758

WinSockAPI的使用

以前用JAVA和VB写过socket的程序,JAVA怎么写的基本已经不记得了,VB好像是调用控件的-。- 前几天想用C写一个,结果TMD在linux下编译的好好的能用,到Windows下就是编译不通过  闷  google之,发现windows下编程的很多限制(姑且称之为限制吧,其实是我windows编程水平弱-.-)  现在linux和windows下都行了,大笑三声

Kingbeful的专栏 1304

使用VB实现QQ好友列表的获取与QQ空间登录

在网络编程领域,Visual Basic(VB)提供了多种技术来实现客户端和服务器之间的通信。它不仅能够帮助开发者构建直观的用户界面,还能够在后台处理复杂的网络通信任务。VB网络编程主要涉及客户端和服务器端的编程,实现数据的发送、接收和处理。对于VB开发者来说,理解网络基础概念,如TCP/IP协议、套接字编程以及数据传输格式是必不可少的。System.Net命名空间包含多个类和枚举,用于处理各种网络协议。例如,和类用于处理HTTP请求和响应,Socket。

weixin_31591833的博客 1046

[VB.NET]Winsock控件(广域网编程)

  <!--google_ad_client = "pub-8333940862668978";/* 728x90, 创建于 08-11-30 */google_ad_slot = "4485230109";google_ad_width = 728;google_ad_height = 90;//--><script type="text/javascript"

VB.NET学习网-VB.NET实例、VB.NET教程、VB.NET源码下载 2711

使用VB实现的TCP局域网数据传输教程

在IT行业中,网络编程已成为开发者不可或缺的技能之一。通过网络编程,我们可以实现数据的交换和共享,构建分布式应用。Visual Basic(VB)作为一种易于学习且功能强大的编程语言,能够通过网络控件,如Winsock控件,来实现网络编程。传输控制协议(TCP)和互联网协议(IP)是构建互联网通信基础的两大核心协议,它们一起构成了TCP/IP模型。该模型是一个四层结构,每一层都有特定的功能,确保数据能够可靠地从一台主机传输到另一台主机。链路层。

weixin_35750953的博客 1124

VB的API方法编写的WINSOCK控件

此代码是VB使用API方法编写的WINSOCK控件,生成的执行文件比较小,功能很强大

VB网络编程中Winsock的使用

原文链接:http://tech.163.com/06/0407/14/2E46BB930009159S.html 如同上面的内容所描述的,不论您使用UDP协议或是TCP协议,Winsock控件都可以允许与远程的设备连接,并且在相互之间交换数据。因此,依据上面的面熟而言,不论您使用的是哪一种协议都可以扮演主机端和客户端的角色。 同时,当您在使用Winsock控件的过程中,这个控件不会显示在正在...

weixin_30950607的博客 454

[VB]一个Socket连接类,封装了Winsock API

VB写的一个Socket连接类,封装了Winsock API

VB

  应用VB开发环境和Winsock控件,编制简单的点对点聊天程序。通过练习4,使学生能了解VB网络编程的基础。本实验要求一个同学在仿真编辑器上,另一个同学在协议分析器上,同时编程实现双机通信。   步骤如下: 启动VB开发环境,新建标准EXE文件,工程1--Form1; 添加WINSOCK控件,方法是:工程->部件,选择Microsoft Winsock contorl

Window 2065

VB使用WinSock API点对点聊天实例

VB6.0使用WinSock API点对点聊天程序实例,VB聊天源码,API.bas中有大家常用的网络聊天API,比如清理内存中一些东西、定义一个连接(正确的叫法是:套接字)、关闭套接字、把端口和套接字绑定在一起、监听,如果你写服务端程序的话,用这个函数来开始监听是否有客户端请求连接,第1个参数是套接字句柄,第2个是允许客户端连接的数量、还有设置接收消息的窗口函数用的,用它把套接字绑定一个窗口,以后关于这个套接字的消息,都会发送到那个窗口的消息处理函数,比如连接成功,连接失败,有客户端请求连接,网络数据到达,网络断开等各种情况,参数:套接字句柄,窗口句柄,消息标志(这样才能知道哪条消息是来自被

VB.NET中Winsock控件的使用详解

VB.NET中Winsock控件的使用详解 axWinsock vb.net

sql 远程连接vb_如何用VB实现多台计算机之间的网络通信?

点击上方蓝字,关注我哦!!VB是一门面向对象、可视化的采用事件驱动机制的编程语言。VB功能强大,应用广泛,除了用VB编程来开发一些日常程序软件外,其还可以与数据库结合来开发综合的数据管理系统,亦可以进行串口通信、二次开发。今天我们就一起来看一下VB在网络编程方面的应用,首先学习一些网络通信的基本控件知识及最简单的程序。VB编写网络程序主要有两种方式:1.winsock控件 ;2.wins...

weixin_28273593的博客 659

VB.NET中Winsock控件的使用详解后续

本来不想说这个问题,是因为我的另一个资料,很多朋友下载了,说是VB6里面的,在VB.NET里面无法使用Winsock。在做次资源,希望能够帮助到大家。资源中有详细说明。 对于老手,还是习惯使用axWinsock 。 1、在VB.NET里面也可以使用。只需要注册一下,就可以(资源中有批处理文件直接运行axWinsock 就注册了) 2、注册后,会生成.NET里面的文件,引用即可使用。 另一个资源: http://download.youkuaiyun.com/detail/linnyn/4159886

VB winsock介绍

   Winsock是Mcrosoft windows提供的网络编程接口,它供了基于TCP/IP协议接口实现方法.通过网络进行的数据通信,需要用地址来表示网络中的主机.TCP/IP协议使用IP地址来作为主机的标识.实现的连接方式是通过IP地址来识别的.通常情况下每台设备运行的不止一个程序,所以为了使用应用程序间的连接,还需要建立一个地址标

wjb9921的专栏 4103

winsock api

支持多实例创建客户、服务器示例(Winsock API)

vb端口转发

摘要:VB源码,系统相关,端口转发 vb简单实现端口转发,VB基于WinsockApi的端口转发程序,因时间问题尚未完成,但基本功能可用,如果有BUG欢迎大家提出。 运行环境:Windows/VB6

两台计算机 串口通信怎么实现,如何实现多台计算机之间的网络通信?

点击上方蓝字,关注我哦!!VB是一门面向对象、可视化的采用事件驱动机制的编程语言。VB功能强大,应用广泛,除了用VB编程来开发一些日常程序软件外,其还可以与数据库结合来开发综合的数据管理系统,亦可以进行串口通信、二次开发。今天我们就一起来看一下VB在网络编程方面的应用,首先学习一些网络通信的基本控件知识及最简单的程序,后续我们会讲解实现两台计算机之间信息的互相传送与接收。VB编写网络程序主要有两种...

weixin_28932845的博客 1351

VB6纯API的Socket控件源码

纯API实现Socket代码,老外写的100多K那个,还算能用。但是存在win7和win10的兼容问题,还有127.0.01IP无效等问题。经过深入研究通讯机制好几天,重写的代码兼容性很好。特别是消息回调机制,思路很新奇。不用拦截消息机制,不用汇编,也不用存储消息队列组。这个控件去掉了异步解析域名的机制,只能用IP。需要域名解析的可以自己加代码。

上一篇: 关于窗口
下一篇: VB中的Winsock编程
wjb9921
博客等级 码龄23年 24粉丝 0原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值