Winsock属性 方法介绍




本文章已收录于:
           
Winsock是Mcrosoft windows提供的网络编程接口,它供了基于TCP/IP协议接口实现方法.通过网络进行的数据通信,需要用地址来表示网络中的主机.TCP/IP协议使用IP地址来作为主机的标识.实现的连接方式是通过IP地址来识别的.通常情况下每台设备运行的不止一个程序,所以为了使用应用程序间的连接,还需要建立一个地址标识.在TCP/IP中使用端口来作为标识号(PORT).IP地址+端口地址.
TCP:实现提供双向,有序无从复的数据流服务,流量控制+差错检测+纠错等功能.
1.VB控件winsock是个运行中不可件的控件,常用属性如下:
byte received 接收到的字节数
local hostname 本地机器名
Local IP 本地IP地址
Local port 本地通信程序的端口
Remote host 远程机器名
Remote host IP 远程IP地址
Remote port 远程通信程序端口
Socket handle 提供调用API得句柄参数
State 连接得当前状态
Protocol 使用协议
Bytereceived:反应接收到得数据量,以字节为单位。
State:返回当前连接状态
0 关闭状态
1 打开状态
2 监听状态
3 连接挂起
4 解析域名
5 正在连接
6 以建立连接
7 正在关闭
8 出错
2.控件
accept接受一个连接请求。格式:对象.accept request ID
bind:多协议接口下,把接口卡,IP地址捆绑再一起。格式:对象。Bina端口号,ip地址
close:关闭连接。格式:对象。Close
connect:发送连接请求。格式:对象。Connect〔ip,远程端口〕
getdata:取出数据后清除缓冲区。
Peekdata:取出数据后不清楚缓冲区。格式:对象。Getdata(peekdata)变量〔,数据类型〔,最大长度〕〕
Listen:侦听。格式:对象。Listen
Senddata:发送数据。格式:对象。Senddata
3.控件事件
Close 远程设备关闭连接时触发事件

Connect 建立连接,进行通信时触发
Connectrequest 有连接请求时触发
Data arrival 有数据到达时触发
Error 错误时触发
Send complete 完成一次数据传送触发
Send progress 数据传送进度


 Winsock的方法属性

Winsock控件对用户是不可视的,可以很容易地访问TCP和UDP网络服务。TOM注:制作网络通讯软件,应该没有比VB+WINSOCK控件更简单的方案了吧? 其可以被Microsoft Access, Visual Basic ,Visual C++或Visual FoxPro开发人员使用。 用Winsock控件编写客户和服务器应用程序,不需要了解TCP或调用底层Winsock API的具体细节。 通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。
Winsock控件使用手册
 
本文使用Word2000排版,如你阅读时版面较凌乱,请使用Word2000阅读。
 
Winsock控件对用户是不可视的,可以很容易地访问TCP和UDP网络服务。TOM注:制作网络通讯软件,应该没有比VB+WINSOCK控件更简单的方案了吧?
其可以被Microsoft Access, Visual Basic ,Visual C++或Visual FoxPro开发人员使用。
用Winsock控件编写客户和服务器应用程序,不需要了解TCP或调用底层Winsock API的具体细节。
通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。
 
TCP基本知识
 
TCP(Transfer Control Protocol)允许你创建并维护一个与远程计算机的连接,使用该连接,两台计算机之间就可以交换数据了。
如果你在创建一个客户应用程序,你必须知道服务器计算机的名字T注:建议用IP地址或IP地址(RemoteHost属性),以及要监听的端口号(RemotePort属性),然后调用Connect方法。
如果你在创建一个服务器应用程序,设置要监听的端口号(LocalPort属性),调用Listen方法。当客户建立连接请求时,产生ConnectionRequest事件。要完成该连接,在ConnectionRequest事件中调用Accept方法。
一旦建立了连接,两台计算机之间就可以发送和接受数据了。要发送数据,调用SendData方法。当接受数据时,产生DataArrival事件。在DataArrival事件中调用GetData方法来检取数据。
 
UDP基本知识
 
UDP(User Datagram Protocol)是无连接的协议。
与TCP操作不同,计算机并不建立一个连接。并且,UDP应用程序可以是客户也可以是服务器。
要传输数据,首先设置客户计算机的LocalPort属性。服务器计算机T注:实际含义是指发送方只需要将RemoteHost属性设置为客户计算机T注:实际上的意思是指接收方的IP地址,将RemotePort属性设置为客户计算机上的LocalPort属性值,然后调用SendData方法开始发送数据。客户计算机在DataArrival事件中使用GetData方法检取数据。
 
 
Winsock控件的属性
 
BytesReceived属性,
LocalHostName属性,
LocalIP属性,
LocalPort属性,
RemoteHost属性(ActiveX控件),
SocketHandle属性,
State属性(Winsock控件),
Protocol属性(Winsock控件),
Name属性,
Parent属性,
RemoteHost属性(ActiveX控件),
RemotePort属性(ActiveX控件),
Index属性(ActiveX控件),
Tag属性(ActiveX控件),
Object属性(ActiveX控件)。
 
Winsock控件的方法
 
Accept方法,
Bind方法,
Close方法(Winsock控件),
Listen方法,PeerData方法,
SendData方法,
GetData方法(WinSock控件),
GetData方法(ActiveX控件)。
 
Winsock控件的事件
 
Close事件,
ConnectionRequest事件,
DataArrival事件,
SendComplete事件,
SendProgress事件T注:该事件表示开始发送了,发送中,好像一般用不到,所以没有说明
Error事件,
Connect事件(Winsock控件),
Connect事件。
 
请参阅可捕获的Internet Transfer 控件错误,使用Winsock控件。
 
 
 
以下的内容以字母为序排列
 
Accept方法
只对于TCP服务器应用程序适用。
该方法用于在处理ConnectionRequest事件时接受连入请求。
应用于Winsock控件。
语法object.Accept requested
object是Winsock控件的对象表达式。
数据类型Long
返回值Void
说明
在ConnectionRequest事件中使用Accept方法。
ConnectionRequest事件相应的参数RequestID也应传递给Accept方法。下面是一个例子:
Private Sub Winsock1_ConnectionRequest _(ByVal requestID As Long)
' Close the connection if it is currently open
' by testing the State property.
If Winsock1.State <> sckClosed Then
Winsock1.Close
' Pass the value of the requestID parameter to the' Accept method.
Winsock1.Accept requested
End Sub
T注:该例写得不是太好,应在新的控件实例中使用该方法,即动态地加载(LOAD)一个新的WINSOCK控件,用新控件而不是处于监听状态的控件去连接
请参阅Connect方法,ConntectionRequest事件。
下面示例的例子列出了使用TCP连接Winsock控件必须的代码,使用RequestID标识请求,该参数传递给接受请求的Accept方法。
Private Sub WinsockTCP_ConnectionRequest _(requestID As Long)
If Winsock1.State <> sckClosed Then
Winsock1.Close
Winsock.Accept requested
End Sub
T注:这就对了!请注意,这次换了个新的SOCK来进行连接,但好像又少了个ENDIF!唉,真是误人子弟:)
 
Bind方法
指定TCP连接中使用的LocalPort和LocalIP。T注:该用法比较少见,更多的是用在UDP通讯中,指定服务器驻守的端口如果你有多个协议适配器,使用该方法。应用于Winsock控件。
语法
object.Bind LocalPort, LocalIP
Bind方法的语法有如下几个部分:
部分                   描述
object      一个Winsock控件的对象表达式
localPort       建立连接所使用的端口号
localIP     建立连接所使用的本地IP地址
说明
在调用Listen方法之前你必须调用Bind方法T注:未必:)在UDP通讯的服务器端,倒是要先调用BIND方法!
请参阅RemoteHost属性(ActiveX控件),RemotePort属性(ActiveX控件)。
 
BytesReceived属性
返回接受数据的数量(当前接受缓冲区中的数据)。使用GetData方法检取数据。在设计时不可用, 在运行时是只读的。
应用于Winsock控件。
语法object.BytesReceived
object是Winsock控件的对象表达式。
返回值Long
请参阅DataArrival事件。
 
Close事件
当远程计算机关闭连接T注:只有TCP是"连接"的,UDP是无"连接"的,或者反过来说,本手册说"连接"时都是指的TCP时产生该事件。应用程序应使用Close方法正确地关闭一个TCP连接。
应用于Winsock控件。
语法object_Close()
object是Winsock控件的对象表达式。
参数     没有
请参阅Close方法(Winsock控件)。
Close方法
关闭客户或服务器应用程序的TCP连接或监听插槽。
应用于Winsock控件。
语法object.Close
object是一个Winsock控件的对象表达式。
参数        没有
返回值      Void
请参阅Close事件。
 
Connect 事件
当一个 Connect 操作完成时发生。
应用于Winsock控件。
语法object.Connect()
object 置换元代表一个对象表达式,其值是一个 Winsock 控件。说明使用 Connect 事件确认已经成功建立了T注:该事件很重要,建议使用该事件而不是别的方法(如STATE的值)来判断一个连接是否已经成功
 
Connect
方法
返回与远程计算机的连接T注:就是去连接!
应用于Winsock控件。
语法object.Connect remoteHost, remotePort
Connect方法的语法有如下几个部分:
部分                      描述
object      一个Winsock控件的对象表达式
remoteHos     要连接的远程计算机的名字
remotePort   要连接的远程计算机的端口号
返回值         没有
说明
当试图建立一个TCP连接时,你必须调用Connect方法。
请参阅Accept方法,ConnectionRequest事件,RemoteHost属性(ActiveX控件),RemotePort属性(ActiveX控件)。
 
ConnectionRequest事件
当远程计算机请求一个连接时产生该事件。只对于TCP服务器应用程序适用。
当有一个连入请求时就触发该事件。
该事件触发之后,RemoteHostIP和RemotePort属性中保存了客户机的信息。
应用于Winsock控件。
语法object_ConnectionRequest ( requestID As Long)
ConnectionRequest事件的语法有如下几个部分:
部分                     描述
object      一个Winsock控件的对象表达式
requested           连入请求标识符。
该参数应传递给第二个控件实例的Accept方法,说明服务器可以确定是否接受一个连入请求。如果没有接受连入请求,在客户将得到Close事件。
适用Accept方法(在新的控件实例中)接受连入请求。
请参阅Accept方法,Connect方法。
 
DataArrival事件
当新数据到达时产生该事件。
应用于Winsock控件。
语法object_DataArrival (bytesTotal As Long)
DataArrival事件的语法有如下几个部分:
部分                    描述
object         一个Winsock控件的对象表达式
bytesTotal      长整数:可以检取数据的总数
说明
如果你不在一次GetData调用中检取所有的数据则不产生该事件。只有当新数据到来时才触发该事件。可以使用BytesReceived属性检查可检取数据的数量。
请参阅BytesReceived属性,SendData方法,SendComplete事件,SendProgress事件。
下面示例的例子在Winsock控件的DataArrival事件中使用了GetData方法。当产生该事件时,代码调用GetData方法检取数据并将其保存在一个字符串中。然后将数据写入一个TextBox控件。
Private Sub Winsock1_DataArrival _(ByVal bytesTotal As Long)
Dim strData As String
Winsock1.GetData strData, vbString
Text1.Text = Text1.Text & strData
End Sub
 
Error事件
后台进程发生错误时产生该事件(如连接失败,后台发送或检取数据失败等)。
应用于Winsock控件。
语法object_Error(number As Integer, Description As String, Scode As Long,Source As String, HelpFile as String, HelpContext As Long, CancelDisplay AsBoolean).
Error事件的语法有如下几个部分:
部分                     描述
object         一个Winsock控件的对象表达式
number        一个整数,指定错误码请参阅"设置"中的常量
description   包含错误消息的字符串scode长
SCODEsource   描述错误源的字符串
HelpFile      包含帮助文件名的字符串
HelpContextHelp         文件环境
CancelDisplay   指明是否取消该显示动作缺省是False,显示缺省的错误消息。如果你不想使用缺省的错误消息,可以将其设置为True
设置
number值的设置如下:
常量                  值     描 述
SckOutOfMemory            7      内存不足
SckInvalidPropertyValue   380    属性值无效
SckGetNotSupported        394    不能读取属性值
SckSetNotSupported        383    属性是只读的
SckBadState               40006  连接事务或请求的协议或
连接状态不正确
SckInvalidArg             40014   传递给函数的参数格式
不正确或范围不对
SckSuccess                40017   成功
SckUnsupported            40018   不支持的变量类型
SckInvalidOp              40020   对于当前的状态,该
操作不正确
SckOutOfRange             40021   参数超出了范围
SckWrongProtocol          40026   连接事务或请求的协议不正确
SckOpCanceled             1004    操作被取消
SckInvalidArgument        10014   请求的地址是广播地
址,但没有设置标记
SckWouldBlock            10035    插槽是非阻塞的,指
定的操作将被阻塞
SckInProgress            10036    过程中有阻塞的
Winsock操作
SckAlreadyComplete       10037    操作完成。过程中没
有阻塞的Winsock操作
SckNonRecoverableError   11003    不可恢复性错误
SckNoData1               1004     名字有效,所请求的类
型没有数据记录
 
GetData方法
检取当前的数据块,将其保存在一个Variant类型的变量中T注:实际上只有字符串/字节组两种类型,参见讲座的第四讲。
应用于Winsock控件。
返回值Void
语法object.GetData data [,type] [,maxLen]
GetData方法的语法有如下几个部分:
部分                描述
object       一个Winsock控件的对象表达式
data        保存取回来的数据的地方/变量。
如果没有足够的空间保存数据,则data设置为Empty
type,可选参数。要检取的数据类型,如"设置"中所示
maxLen,可选参数。在检取字节矩阵或字符串时指定检取长度。如果没有指定该参数,则检取字节矩阵或字符串中的所有数据。如果数据类型不是字节矩阵或字符串,则忽略该参数
设置
type值的设置如下:
描述                   常量

 

 

 

 

 

 

Byte                vbByte

Integer             vbInteger
Long                vbLong
Single              vbSingle
Double              vbDouble
Currency            vbCurrency
Date                vbDate
Boolean             vbBoolean

SCODE               vbError

String              vbString
Byte矩阵           vbArray + vbByte
说明
通常在DataArrival事件中使用GetData方法,其包含了一个totalBytes参数。如果你指定的maxLen比totalBytes参数小,则将得到一个10040警告,表明其余数据将丢失T注:非万不得已,不要用该参数,应该一次性地将数据全部取回,再慢慢处理
 
Listen方法
创建一个插槽,并设置为监听模式。
该方法只适用于TCP连接。
应用于Winsock控件。
语法object.Listen
object是一个Winsock控件的对象表达式。
参数        没有
返回值      Void
说明
当有连入请求时产生ConnectionRequest事件。
在处理ConnectionRequest事件时,应用程序应使用Accept(在新的控件实例)方法接受连接。
请参阅Connect方法,Close方法(Winsock控件)。
 
LocalHostName属性
返回本地计算机的名字。只读,在设计时不可用。
应用于Winsock控件。
语法object.LocalHost Name
object是一个Winsock控件的对象表达式。
返回值      String
 
LocalIP属性
返回本地计算机的IP地址。只读属性,在设计时不可用。
应用于Winsock控件。
语法object.LocalIP
object是Winsock控件的对象表达式。
数据类型String
 
LocalPort属性
返回或设置本地使用的端口。可读写,在设计时可用。
对于客户,这将指定发送数据的端口。如果应用程序不需要特定的端口,指定为0。在这种情况下,控件将随机选择一个端口。连接建立后,该本地端口就用于TCP连接。对于服务器,这是监听的本地端口。如果指定为0,则随机选用一个端口。在调用了Listen方法之后,属性包含了实际选中的端口。
应用于Winsock控件。
语法object.LocalPort=long
object是一个Winsock控件的对象表达式。
数据类型       Long T注:讲座中好像搞错了,实际上长短均可:)
说明
通常使用端口0在两台计算机之间动态建立连接。例如,希望服务器回调的客户可以使用端口0随机选中一个端口号,该端口号将传递给远程的服务器。
 
PeekData方法
与GetData方法类似,只是其不从输入队列中删除数据。
应用于Winsock控件。
语法object.PeekData data [,type] [,maxLen]
PeekData方法的语法有如下几个部分:
部分                  描述
object       一个Winsock控件的对象表达式
data         保存取回的数据的地方/变量
如果没有足够的空间保存数据,则data设置为Empty。
type可选参数。要检取的数据类型,如"设置"中所示。缺省是vbArray+ vbByte
maxLen可选参数。在检取字节矩阵或字符串时指定检取长度。如果没有指定该参数,则检取字节矩阵或字符串中的所有数据。
如果数据类型不是字节矩阵或字符串,则忽略该参数
设置
type值的设置如下:
描述                     常量
Byte                   vbByte
Integer                vbInteger
Long                   vbLong
Single                 vbSingle
Double                 vbDouble
Currency               vbCurrency
Date                   vbDate
Boolean                vbBoolean
SCODE                  vbError
String                 vbString
Byte矩阵              vbArray + vbByte
返回值          Void
说明
如果类型指定为vbString,则数据返回给用户之前转换为UUICODE。
请参阅GetData方法(Winsock控件)。
 
Protocol属性
返回或设置Winsock控件使用的协议,TCP或UDP。
应用于Winsock控件。
语法object.Protocol [=protocol]
object是Winsock控件的对象表达式。
设置protocol值的设置如下:
常量                  值          描述
sckTCPProtocol        0     缺省。使用TCP协议
sckUDPProtocol        1     使用UDP协议
返回值       Void
说明
在重新设置该属性之前必须关闭控件(使用Close方法)。
 
RemoteHostIP属性
返回远程计算机的IP地址。对于客户应用程序,使用Connect方法建立连接之后,该属性包含了远程计算机IP字符串。对于服务器应用程序,进来一个连接请求时,该属性包含了初始化请求的远程计算机的IP字符串。在使用UDP协议时,在DataArrival事件产生后,该属性包含了发送UDP数据的远程计算机的IP地址。
应用于Winsock控件。
语法object.RemoteHostIP
object是Winsock控件的对象表达式。
数据类型String
 
SendComplete事件
当发送操作完成时产生该事件。
应用于Winsock控件。
语法object_SendComplete
object是一个Winsock控件的对象表达式。
参数         没有
请参阅DataArrival事件,SendProgress事件。
 
SendData方法
给远程计算机发送数据。
返回值Void
应用于Winsock控件。
语法object.SendData data
SendData方法的语法有如下几个部分:
部分                 描     述
object          一个Winsock控件的对象表达式
data            要发送的数据T注:只能发送字符串/字节组,对
于二进制数据,应使用字节矩阵
说明
当传递UNICODE字符串时,在发送之前转换为ANSI字符串。
 
 
SendProgress事件
在发送数据时产生该事件。
应用于Winsock控件。
语法object_SendProgress (bytesSent As Long, bytesRemaining As Long)
SendProgress事件的语法有如下几个部分:
部分                 描      述
object       一个Winsock控件的对象表达式
bytesSent   从上次触发该事件到现在已发送数据的字节数
bytesRemaining  在发送缓冲区中等待发送数据的字节数
请参阅DataArrival事件,SendComplete事件。
 
SocketHandle属性
返回一个值,该值与Winsock控件用来与Winsock层通信所用的插槽句柄相对应。该属性是只读的,在设计时不可用。
应用于Winsock控件。
语法object.SocketHandle
object是一个Winsock控件的对象表达式。
数据类型          Long
说明
该参数将传递给Winsock API。
State属性
返回控件的状态,以枚举类型表示。该属性是只读的,在设计时不可用。
应用于Winsock控件。
语法object.State
object是一个Winsock控件的对象表达式。
数据类型       Integer
设置
State属性的设置如下:
常量                    值   描述
SckClosed                0   缺省。关闭
SckOpen                  1   打开
SckListening             2   监听
SckConnectionPending     3   连接未决
SckResolvingHost         4   解析主机
SckHostResolved          5   主机被解析
SckConnecting            6   连接
SckConnected             7   已连接
SckClosing               8   对方在关闭连接
SckError                 9   错误
T注:不要过于信任STATE属性,在可以用事件来判断的时候,应该以所触发的事件为准来判断当前的状态。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值