如何使用 Winsock 控件进行常用网络应用开发
Winsock 控件的属性、方法、事件
1.Winsock 控件的属性
(1)BytesReceived 属性
数值型。返回接收到的(当前在接收端缓冲区内的)数据的数量。使用 GetData 方法来
获取数据。该属性在设计时是只读的,而且不可用。
(2)LocalHostName 属性
字符型。返回本地机器名。该属性在设计时是只读的,而且不可用。
(3)LocalIP 属性
字符型。返回本地机器的 IP 地址,格式是 IP 地址加点字符串(xxx.xxx.xxx.xxx)。该属
性在设计时是只读的,而且不可用。
(4)LocalPort 属性
数值型。返回或者设置所用到的本地端口。该属性在设计时是可读/写的,而且是可用的。
对客户来说,该属性指定发送数据的本地端口。如果应用程序不需要特定端口,则指定
0 为端口号。在这种情况下,控件将选择一个随机端口。在建立起连接之后,这就是用于
TCP 连接的本地端口。
对于服务器来说,这是用于侦听的本地端口。如果指定的是端口 0,就使用一个随机端
口。在调用了 Listen 方法后,属性就包含了已选定的实际端口。
在计算机之间常用端口 0 来动态地建立连接。例如,一个客户希望服务器给他"回电话",
它就可用端口 0 获得新的(随机)端口号,然后将该端口号交给远程计算机,从而达到目的。
(5)Protocol 属性
数值型。返回或设置 Winsock 控件所使用的协议,0 表示为 TCP 协议,1 表示为 UDP
协议,缺省值为 0。
○1 TCP 基础
数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据
传输。
如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),
还要知道进行"侦听"的端口(RemotePort 属性),然后调用 Connect 方法。
如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。
当 客 户 计 算 机 需 要 连 接 时 就 会 发 生 ConnectionRequest 事 件 。 为 了 完 成 连 接 , 可 调 用
ConnectionRequest 事件内的 Accept 方法。
建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。
当接收数据时会发生 DataArrival 事件,调用 DataArrival 事件内的 GetData 方法就可获取数
据。
○2 UDP 基础
用户数据文报协议(UDP)是一个无连接协议。跟 TCP 的操作不同,计算机并不建立连
1
帮助手册
接。另外 UDP 应用程序可以是客户机,也可以是服务器。
为了传输数据,首先要设置客户计算机的 LocalPort 属性。然后,服务器计算机只需将
RemoteHost 设置为客户计算机的 Internet 地址,并将 RemotePort 属性设置为跟客户计算机
的 LocalPort 属性相同的端口,并调用 SendData 方法来着手发送信息。于是,客户计算机使
用 DataArrival 事件内的 GetData 方法来获取已发送的信息。
(6)RemoteHost 属性
字符型。返回或设置远程计算机,控件向它发送数据或从它那里接收数据。既可提供主
机名,比如"ftp://ftp.microsoft.com",也可提供点格式下的 IP 地址字符串,如"100.0.1.1"。
(7)RemoteHostIP 属性
字符型。返回远程机器的 IP 地址。
对于客户应用程序来说,已经用 Connect 方法建立连接后,属性就包含了远程机器的 IP
字符串。
对于服务器应用程序来说,在请求连接(ConnectionRequest 事件)之后,属性包含远程
计算机的 IP 字符串,该字符串启动了连接。
当使用 UDP 协议时,在 DataArrival 事件出现之后,属性包含了发送 UDP 数据的计算机
的 IP 地址。
(8)RemotePort 属性
数值型。返回或设置要连接的远程端口号。
在设置 Protocol 属性时,将对每个协议自动把 RemotePort 属性设置成适当的缺省端口。
表 7-17 列出了一些常用缺省端口号。
表 7-17
常用协议/服务缺省端口号
端口号
80
21
110
25
119
23
194
53
49
162
69
118
协议/服务
HTTP(Hyper Text Transfer Protocol)
FTP(File Transfer Protoco)
POP3(Post Office Protocol version 3)
SMTP(Simple Mail Transfer Protocol)
NNTP(Network News Transfer Protocol)
TELNET(Telnet)
IRC(Internet Relay Chat)
DNS(Domain Name Server)
Login(Login Host Protocol)
SNMP ( Simple Network Management
Protocol)
TFTP(Trivial File Transfer)
SQLSERV(SQL Services)
(9)SocketHandle 属性
说明
超文本传输协议
文件传输协议
邮局协议
简单邮件传输协议
网络新闻传输协议
远程登录
因特网中继交谈(用于适时聊天)
域名服务器
登录主机协议
简单网络管理协议
简单文件传输协议
SQL 服务
数值型。返回一个与套接字句柄对应的值,控件用套接字句柄同 Winsock 层通信。在设
计时是只读的,而且不可用。
该属性是为了传递到 Winsock APIs 而设计的。
2
如何使用 Winsock 控件进行常用网络应用开发
(10)State 属性
数值型。返回控件的状态。在设计时是只读的,而且不可用。
State 属性的返回值如表 7-18 所示。
常量
sckClosed
sckOpen
sckListening
sckConnectionPending
sckResolvingHost
sckHostResolved
sckConnecting
sckConnected
sckClosing
sckError
表 7-18
返回值
0
1
2
3
4
5
6
7
8
9
State 属性的返回值
说明
缺省的。关闭
打开
侦听
连接挂起
识别主机
已识别主机
正在连接
已连接
同级人员正在关闭连接
错误
2.Winsock 控件的方法
(1)Accept 方法
仅适用于 TCP 服务器应用程序,在处理 ConnectionRequest 事件时用这个方法接受新连
接。
语法
object.Accept(requestID)
参数
requestID
数值型。新连接请求标识。
返回值
无。
说明
在 ConnectionRequest 事件中使用 Accept 方法。ConnectionRequest 事件有一个对应的参
数,即 RequestID 参数,该参数应该传给 Accept 方法。请看下例:
PROCEDURE ConnectionRequest
LPARAMETERS RequestID
IF This.OBJECT.State#0 &&测试 State 属性,如果当前连接是打开的话,关闭连接
This.OBJECT.Close
This.OBJECT.Accept(RequestID)
ENDIF
ENDPROC
(2)Bind 方法
指定用于 TCP 连接的 LocalPort 和 LocalIP。如果有多协议适配卡,使用该方法。
语法
object.Bind (LocalPort, LocalIP)
3
帮助手册
参数
LocalPort
数值型。用来建立连接的端口。
LocalIP
字符型。用来建立连接的本地 Internet 地址。
返回值
无。
说明
在调用 Listen 方法之前必须调用 Bind 方法。
(3)Close 方法
对客户机和服务器应用程序关闭 TCP 连接或侦听套接字。
语法
object.Close
参数
无。
返回值
无。
(4)Connect 方法
请求一个到远程计算机的连接。
语法
object.Connect (RemoteHost, RemotePort)
参数
RemoteHost
字符型。必需的,要连接的远程计算机的名称或 IP 地址。
RemotePort
数值型。要连接的远程计算机的端口。
返回值
无。
说明
在要建立一个 TCP 连接时调用该方法。
(5)GetData 方法
获取当前缓冲中的数据块并将其存储在变体类型的变量中,并清空缓冲。
语法
object.GetData (Data, [Type,] [MaxLen])
参数
Data
在方法成功返回之后存储获取数据的地方。如果对请求的类型没有足够可用的数据,则
将 data 设置成 Empty。
Type
可选的。获取的数据类型。可用的设置值如表 7-19 所示。
表 7-19
常量
设置值
17
Type 参数可用的设置值
说明
Byte
vbByte
4
如何使用 Winsock 控件进行常用网络应用开发
vbInteger
vbLong
vbSingle
vbDouble
vbCurrency
vbDate
vbBoolean
vbError
vbString
vbArray + vbByte
可选的。在接收到字节数组或字符串时所需大小。如果对字节数组或字符串、参数丢失、
Integer
Long
Single
Double
Currency
Date
Boolean
SCODE
String
Byte Array
2
3
4
5
6
7
11
10
8
8192+17
则将获取所有可用数据。如果提供的数据类型不是字节数组或字符串,则忽略这个参数。
返回值
无。
说明
通常总是将 GetData 方法与 DataArrival 事件并用,而 DataArrival 事件包含 TotalBytes
参数。如果指定一个比 TotalBytes 参数小的 Maxlen,则将得到警告 10040,以此指出剩余的
字节将丢失。
(6)Listen 方法
创建套接字并将其设置为侦听模式,该方法仅适用于 TCP 连接。
语法
object.Listen
参数
无。
返回值
无。
说明
当有新连接时就会出现 ConnectionRequest 事件。处理 ConnectionRequest 事件时,应用
程序应该用 Accept 方法接受连接。
(7)PeekData 方法
用缓冲中的内容填充变量, 但不清空缓冲,除了这一点之外,方法与 GetData 相似。该
方法仅适用于 TCP 连接。
语法
object.PeekData (Data, [Type,] [MaxLen])
参数
Data
在方法成功地返回之后存储获取的数据。如果对于没有足够的适于所请求的类型来说没
有足够可用的数据,那么 Data 将被设置为 Empty。
Type
可选的。所获取的数据类型,可用设置值如表 7-19 所示。缺省值为:vbArray + vbByte。
MaxLen
可选的。在收到字节数组或字符串时,长度指定了所需要的大小。如果对字节数组或字
符串的参数丢失,则将获取所有可用的数据。如果提供的数据类型不是字节数组和字符串的
5
帮助手册
话,则忽略该参数。
返回值
无。
说明
如果所指定的类型为 vbString,则在返回到用户之前,字符串数据将转化成 UNICODE。
(8)SendData 方法
将数据发送给远程计算机。
语法
object.SendData (Data)
参数
Data
要发送的数据。对于二进制数据应使用字节数组。
返回值
无。
说明
当传进 UNICODE 字符串并在网络上发送出去之前,将转化成 ANSI 字符串。
3.Winsock 控件的事件
(1)Close 事件
当远程计算机关闭连接时出现。应用程序应正确使用 Close 方法关闭 TCP 连接。
语法
PROCEDURE Close
ENDPROC
参数
无。
(2)Connect 事件
当一个 Connect 操作完成时发生。
语法
PROCEDURE Connect
ENDPROC
参数
无。
说明
使用 Connect 事件确认已经成功建立了一个连接。
(3)ConnectionRequest 事件
当远程计算机请求连接时出现。仅适用于 TCP 服务器应用程序,在请求一个新连接时激
活该事件。激活事件之后,RemoteHostIP 和 RemotePort 属性存储有关客户的信息。
语法
PROCEDURE ConnectionRequest
LPARAMETERS RequestID
ENDPROC
参数
6
如何使用 Winsock 控件进行常用网络应用开发
RequestID
新连接请求标识。
说明
服务器可决定是否接受连接。如果不接受新连接,则同级人员(客户)将得到 Close 事
件;用 Accept 方法接受新连接。
(4)DataArrival 事件
当新数据到达时发生。
语法
PROCEDURE DataArrival
LPARAMETERS BytesTotal
ENDPROC
参数
BytesTotal
数值型。可获取的数据总数量。
说明
如果没有获取一个 GetData 调用中的全部数据,则事件不会出现。只有存在新数据时才
激活事件。可随时用 BytesReceived 属性检查可用的数据量。
(5)Error 事件
无论何时,只要后台处理中出现错误(例如,连接失败,或者在后台收发数据失败)事
件就会出现。
语法
PROCEDURE Error
LPARAMETERS
Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay
ENDPROC
参数
Number
数值型。定义错误代码的整数,可返回的错误代码如表 7-20 所示。
常量
sckOutOfMemory
sckInvalidPropertyValue
sckGetNotSupported
sckSetNotSupported
sckBadState
sckInvalidArg
sckSuccess
sckUnsupported
sckInvalidOp
sckOutOfRange
sckWrongProtocol
sckOpCanceled
sckInvalidArgument
表 7-20
错误代码
错误代码
描述
7
380
394
383
40006
40014
40017
40018
40020
40021
40026
1004
10014
内存不足
属性值无效
属性不可读
属性是只读的
所请求的事务或请求本身的错误协议或者错误连接状态
传递给函数的参数格式不确定,或者不在指定范围内
成功
不受支持的变量类型
在当前状态下的无效操作
参数越界
所请求的事务或请求本身的错误协议
取消操作
所请求的地址是广播地址,但未设置标记
7
帮助手册
描述符不是套接字
数据报太大,不适于缓冲区的要求,因而被截断
来自本地机器的不可用地址
网络子系统失败
通过远端重新设置连接
没有可用的缓冲空间
不支持指定的端口
地址在使用中
已连接套接字
未连接套接字
已关闭套接字
已关闭套接字
此时不能从主机到达网络
在设置 SO_KEEPALIVE 时连接超时
由于超时或者其它失败而中止连接
套接字不成块,而指定操作将使之成块
制造块的 Winsock 操作在进行之中
完成操作。未进行制造块的操作
10035
10036
10037
10038
10040
10043
10048
10049
10050
10051
10052
11053
10054
10055
10056
10057
10058
10060
10061
10093
11001
11002
11003
11004
sckWouldBlock
sckInProgress
sckAlreadyComplete
sckNotSocket
sckMsgTooBig
sckPortNotSupported
sckAddressInUse
sckAddressNotAvailable
sckNetworkSubsystemFailed
sckNetworkUnreachable
sckNetReset
sckConnectAborted
sckConnectionReset
sckNoBufferSpace
sckAlreadyConnected
sckNotConnected
sckSocketShutdown
sckTimedout
sckConnectionRefused
sckNotInitialized
sckHostNotFound
sckHostNotFoundTryAgain
sckNonRecoverableError
sckNoData
Description
字符型。包含错误信息的字符串。
Scode
数值型。长 SCODE。
Source
字符型。描述错误来源的字符串。
HelpFile
字符型。包含帮助文件名的字符串。
HelpContext
数值型。Help 文件上下文。
CancelDisplay
逻辑型。指示是否取消显示。缺省值为.F.,以此显示缺省的错误信息框。如果不想使用
强行拒绝连接
应首先调用 WinsockInit
授权应答:未找到主机
非授权应答:未找到主机
不可恢复的错误
无效名,对所请求的类型无数据记录
缺省的信息框,则将 CancelDisplay 设置成.T.。
(6)SendComplete 事件
在完成一个发送操作时发生。
语法
PROCEDURE SendComplete
ENDPROC
参数
8