您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页VB_WinSock网络编程

VB_WinSock网络编程

来源:意榕旅游网
VB_WinSock网络编程

(河南科技学院 计科系 001班,河南 新乡 453003)

摘要 本文通过对一个VB实例开发过程的介绍,阐述了VB程序开发的一般方法。并且在文中详细地介绍了客户端/服务器(C/S)模型,以及在VB网络程序开发中对C/S模型的应用。另外,文中介绍了VB中WinSock控件的具体用法,以及VB中WinSock的各个属性和方法的设置与使用方法。除此以外,本文还有VB程序设计后期的异常处理与调试的方法的介绍。 关键词 VB程序开发,C/S模型, VB程序调试,异常处理,WinSock控件

ABSTRACT During the development process of a example edited by the VB program, it gives us a way about the program development of VB. It also interpret the client/server model explicitly and how to compiler we use it. In the text it has the specific way about the control unit in the WinSock, including the every attribute and setting the method. Excepting it introduces the exception handling after the design for a program and the method of the program debugging.

Keywords VB program development, Client/Server Model, VB program debugging, Exception

handling, WinSock control

1 引言

随着网络的发展,计算机应用、软件开发都有了一个新的发展方向——网络。所以,随之而来的,网络软件的开发,也成了一个新的焦点。而作为一个简单而实用的编程语言——VB,对网络软件开发自然也有它的独到之处,不管是对C/S模型的方便使用,还是对Windows Sockets的优化封装,都给我们提供了更方便的编程环境,本文将介绍在VB编程过程中遇到错误时的调试方法,以及各序运行时对产生的异常错误的处理方法。 2 客户端/服务器模型 (C/S)

Client Client

Client Client Server

Client Client

图 简单的C/S模型

如图所示,是一个简单的C/S模型参考图。在上图中,我们可以明显的看到,一个服务器可以同时与多个客户机连接,在其中起到服务器的作用。不难看出,客户端程序依靠于服务器程序存在,通过服务器程序与其他客户进行数据的交换,所以,在C/S模型中,Server起着重要的作用,在一个C/S模型下形成的软件中,缺少了Server,单单的Client是不能运行的。

对于采用C/S模型的软件,是由客户端和服务器端共同存在的,在整个软件的运行过程

中,有个先后的顺序,必须由如下的顺序运行:

1. 首先服务器要启动,初始化服务器程序,等待客户机的请求;

2. 客户机启动,向服务器发送连接请求(TCP)或是直接发送登陆数据(UDP); 3.在允许的范围内,等待所有用户的加入; 4.客户机完成所需功能,退出程序;

5.服务器确认所有用户都已退出,结束程序运行。

C/S模型初步实现了软件的分布式,C/S模型中的服务器有时候也可以认为是后台程序,即运行于后台,向Client提供服务。 3 WinSock控件

3.1 WinSock控件简介

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

而WinSock控件是一个ActiveX控件,它所对应的文件是Windows安装目录下的\\System\\MsWinSck.ocx,在VB中使用WinSock控件之前,必须在工程中加入Microsoft WinSock Control控件。

WinSock控件是对WinSock进行的封装,允许我们使用两个著名传输层协议:一种协议是TCP(Transmission Control Protocol,传输控制协议),另一种协议是UDP(User DataGram Protocol,用户数据报协议).

WinSock控件的工作原理是这样的:服务器端不停地监听检测客户端的请求,客户端则向服务器端发送连接请求,当两者的协议沟通时,客户端和服务器端之间就建立起了连接。这时候,客户端继续请求服务器发送或者接受数据,服务器则在等待客户端的这些请求。一旦请求被接纳,客户端和服务器端就可以实现双向数据传输了。 3.2 WinSock控件的主要属性和方法 (1)Protocol属性:用于设置WinSock所使用的协议类型,TCP协议对应于常量sckTCPProtocol,UDP协议对应于常量sckUDPProtocol。

(2)SocketHandle属性:返回当前Socket连接的句柄,是一个只读属性,常用于将句柄传给Windows Socket API。

(3)RemoteHostIP属性:返回远程计算机的IP,为只读属性。 (4)ByteReceived属性:返回当前接收缓冲区中的字节数。

(5)State属性:用于返回WinSock控件当前的状态。WinSock的各种状态如下表: 常量 sckClosed sckOpen sckListening sckConnectionPending sckResolvingHost sckHostResolved sckConnecting sckConnected sckClosing sckError 取值 0 1 2 3 4 5 6 7 8 9 含义 默认值,表示控件处于断开状态 控件处于断开状态,但Socket打开 正在监听检测 正在等待连接 正在解析域名,查找服务器 域名解析完成,找到服务器 正在建立连接 连接建立成功 正在关闭连接 发生错误 (6)Bind方法:在UDP协议时,用该方法可以把一个端口号固定为本控件使用。其格式为:

wskName.Bind [LocalPort][LocalIP]

(7)Listen方法:当使用TCP协议时,创建一个WinSock套接字以后将其处于监听状态。 (8)Connect方法:在使用TCP协议与远程计算机建立连接时,使用该方法,其格式为:wskName.Connect RemoteHost,RemotePort (9)Accept方法:用于TCP协议,服务器决定是否接受客户机的连接请求,如果接受连接请求,则可以用Accept方法。

(10)SendData方法:用于发送数据。

(11)GetData方法:当有数据到达时,使用该方法从缓冲区中接受数据,其格式为: wskName.GetData data[,type][,maxlen],其含义是从缓冲区取出最大长度为maxlen的数据,并以type为类型,保存到data中。

(12)PeekData方法:功能与GetData类似,但是PeekData去完数据后不把相应的缓冲区清空。 3.3 WinSock控件的主要事件

(1)ConnectRequest事件:当使用TCP协议时,在服务器端得到客户端的连接请求时触发。 (2)SendProgress事件:当一端计算机向另一端计算机发送数据时,SendProgress事件触发,可以记载当前已发送的字节数与剩余的字节数。

(3)SendComplete事件:当所有的数据传送完毕时,触发该事件。

(4)DataArrival事件:当远程数据到来时,控件触发该事件,往往在该事件中设置接收数据的代码。

(5)Error事件:当发生错误时触发,可返回错误序号。 3.4 WinSock的使用技巧

WinSock控件在使用的过程中有很多的技巧,下面就我个人在使用过程中的使用经验作以简单的介绍。

(1)使用前必须进行初始化,这一过程往往在Form_Load事件中进行处理,在TCP模式下的代码为:

Provide Sub Form1_Load()

SckName.LocalPort = localport ‘为其分配本地端口 SckNmae.Listen ‘使WinSock控件进入监听状态 …… ‘其他需要初始化的程序 End Sub

作为UDP使用时,代码为:

Provide Sub Form1_Load()

SckName.LocalPort = localport ‘为其分配本地端口 SckName.Bind ‘将其梆定在该端口 ‘或者如下代码也可实现 ‘SckName.Bind localport

…… ‘其他需要初始化的程序 End Sub

(2)可以为传送的数据进行编码,以使不同的编码代表不同的功能。比如,在一个聊天系统中,可以让传送的数据分别以“c”和“l”开头,代表发送的分别为聊天信息和登陆信息。 (3)在初始化控件时,加入差错控制语句,对出现的差错进行处理。代码如下:

Provide Sub Form1_Load() On Error Goto ERR ‘设置陷阱,处理差错 ‘对WinSock控件或其他对象初始化 ……

Exit Sub ERR: …… ‘差错处理代码 End Sub

4 VB程序调试技巧

程序开发的后期,调试已经成为一个不可忽略的步骤。是否可以在调试的过程中快速的找到问题的所在,是能否快速排除问题,完成软件的关键。下面将我个人在VB中使用中的一些关于测试的经验给以介绍。

首先介绍VB中的错误类型,VB中的错误类型分为三类:语法错误,执行错误和逻辑错误。其中语法错误如:

Form_Click事件中的Print方法出现了拼写错误,提示为“子程序或函数未定义”,这就是VB中的语法错误。

另一类是执行错误,如下:

在上面的例子中出现“实时错误,无效的过程调用或函数”,在上例中,最后对一个负数求平方根时,提示出错,即执行错误。

逻辑错误是在运行的过程中没有提示错误,而程序执行的结果与希望的结果不同,也就是程序在逻辑上发生了错误,这类错误在调试的过程中最难能发现。如:运算符使用不正确,语句的次序不对、循环语句的起始、终值不正确等。

在对程序进行调试时,首先要确定程序中错误的所在,确定错误出现的过程或函数,然

后在关键语句上加入断点,以使程序在运行到此位置时可以中断,以方便进行变量的监测。

当程序执行到断点位置时,会发生中断,然后可以使用F8进行单步测试,或者使用Ctrl+F8使程序运行到光标处,Shift+F8运行当前的过程或函数。 5 WinSock控件使用实例 5.1 用TCP实现端口扫描

该程序原理为WinSock控件工作在TCP模式下时,当其对一个端口进行侦听(Listen)时,如果该端口在使用中,则会有一个错误号为10048的错误,利用该错误,可以判断端口是否在使用中。

代码如下:

Private Sub cmdScan_Click() Dim i As Long

Dim arr[] As Boolen ‘用于保存扫描结果 …… ‘获得开始端口与结束端口 ReDim arr[EndPort – StartPort] For i = StartPort to EndPort Pause 0.05 Arr[i - StartPort + 1] = ScanPort I, tcpTest Next i End Sub

‘ScanPort函数的定义

Private Function ScanPort(i as Long, wsk as WinSock) as Boolen ScanPort = False

On Error GoTo ErrHandle ‘设置陷阱,等待错误 wsk.close

wsk.LocalPort = i ‘为其分配端口 wsk.Listen ‘开始监听,正在使用是触发Error事件 Pause 0.1 wsk.Close Exit Function ErrHandle:

If Err.Number = 10048 Then ScanPort = True ‘如果端口正在使用,则返回真 End If

End Function

上例中代码只是处理端口的部分代码,具体对得出数据的处理,还需要自己附加代码。运行结束后,从StartPort到EndPort的所有端口状态,保存在数组arr[]中。 5.2 用UDP实现对等聊天

UDP协议的使用要比TCP简单,因为UDP协议不需要建立、使用、释放连接的过程,只要端口初始化好以后,就可以直接发送数据。在作为UDP客户端使用时,我们只需为其指定远程主机(RemoteHost)及远程端口(RemotePort),然后,绑定(Bind)在一个本地端口(LocalPort),便可向远程的服务器发送数据。服务器端则只需绑定(Bind)一个本地端口(LocalPort),即进入等待客户机连接的状态。 Type Form

Name frmChat Caption/Text UDP聊天演示 Label Label Text Text Label WinSock Command lblHost lblChat txtHost txtChat lblMessage udpChat cmdSend 表:窗体对象基本属性 对方IP 发送内容 - - - - 发送 代码实现为:

Dim intCounter As Integer Private Sub cmdSend_Click()

udpChat.RemoteHost = txtHost.Text '设置远程IP udpChat.SendData txtChat.Text '使用SendData方法发送数据 End Sub

Private Sub Form_Load() intCounter = 0

udpChat.Protocol = sckUDPProtocol '设置使用协议为UDP udpChat.RemotePort = 2000 '设置远程端口为2000 udpChat.Bind 2000 '绑定本地端口为2000 End Sub

Private Sub udpChat_DataArrival(ByVal bytesTotal As Long) Dim strDataAcc As String intCounter = intCounter + 1 If intcouter >= 6 Then

lblMessage.Caption = \"\" intCounter = 0 End If

udpChat.GetData strDataAcc, vbString '接收数据 lblMessage.Caption = lblMessage.Caption & _ vbCrLf & udpChat.RemoteHostIP & _

\" : \" & strDataAcc '显示接收到的数据 End Sub

上面的两个例子分别是WinSock控件在TCP和UDP模式下的实例,通过这两个例子,不难总结出:在TCP模式下,作为Server的一方必须先分配端口,并开始监听;而在UDP模式下,作为Server的一方只要绑定一个端口,然后等待Client的数据就可以了。 参考文献

[1] 刘韬、骆娟等 《Visual Basic 6.0 实效编程百例》 北京:人民邮电出版社 [2] 李怀明、骆原等《Visual Basic 6.0 中文版参考详解》 北京:清华大学出版社 [3] 萧秋水,文娟 《Windows 网络编程之VB篇》 北京:清华大学出版社 [4] 蔡开裕 《计算机网络》 机械工业出版社

[5] 相万让 《计算机网络应用基础》 北京:人民邮电出版社 [6] 曾悠玛 《VB程序设计事例导学》 北京:科海电子出版社

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务