收藏 分享(赏)

VB中使用WinSock控件编写网络程序.doc

上传人:dzzj200808 文档编号:2722518 上传时间:2018-09-26 格式:DOC 页数:20 大小:104KB
下载 相关 举报
VB中使用WinSock控件编写网络程序.doc_第1页
第1页 / 共20页
VB中使用WinSock控件编写网络程序.doc_第2页
第2页 / 共20页
VB中使用WinSock控件编写网络程序.doc_第3页
第3页 / 共20页
VB中使用WinSock控件编写网络程序.doc_第4页
第4页 / 共20页
VB中使用WinSock控件编写网络程序.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、VB 中使用 WinSock 控件编写网络程序 WinSock 控件能够通过 UDP 协议(用户数据报协议)或 TCP 协议(数据传输协议)连接到远程的机器并进行数据交换。这两种协议都能用来创建客户端和服务端应用程序。就像定时器控件一样,WinSock 控件运行时没有一个可视的界面。可能的用途创建客户端应用程序,它能在信息到达中央服务器之前把用户的信息收集起来。创建服务端应用程序,它能作为来自多个用户的数据一个集中处理点。创建“聊天”程序。协议的选择当我们使用 WinSock 控件时,首先要确定的是使用 TCP 还是 UDP 协议。它们之间主要的区别在于连接状态:TCP 协议控件是一个基于连接

2、的协议,就像电话机一样,用户必须在通话之前建立连接;UDP 是一个无连接的协议,两台计算机之间的事务处理就像传纸条一样:一台计算机向另一台计算机发送消息,但是它们之间并没有一个明确的连接路径。另外,发送的单个信息量的大小取决于网络。通常,你要创建的应用程序的类别就决定了你要选择的协议。以下是几个能够帮助你选择合适的协议的问题:当发送或接收数据时,该应用程序需要从服务端或客户端获得认证吗?如果要的话,那么 TCP 协议就正好需要在发送或接受数据前建立明确的连接。要发送的数据量大吗?(就像图片、声音文件之类)一旦建立了连接,TCP 协议就会保持连接并保证数据的完整性。但是,这种连接会占用的更多的处

3、理器资源,成本也会更高一些。数据是陆续传输的,还是一次全部传完呢?比如,如果你要创建的应用程序在某些任务完成时会告知具体的计算机,那么选择 UDP 协议会更合适一些。UDP 协议也更适合于发送小量数据。协议的配置配置你的应用程序所用到的协议:在设计阶段,单击工具窗口里的协议,选择sckTCPProtocol 或 sckUDPProtocol。你也可以在代码里配置协议,就像下面这样:Winsock1.Protocol=sckTCPProtocol确定你的计算机名要连接到远程的计算机,你必须知道它的 IP 地址或别名。 IP 地址是一串用句点分隔的 3 位数字。通常,计算机的别名更容易让人记住。按

4、下面的步骤可以找到你的计算机名:在“任务栏”里单击“ 开始”在“设置” 选项里单击“ 控制面板” ;双击“网络”图标;单击“网络标识”在“计算机名”中显示的就是你的计算机名。一旦你找到你的计算名,它就可以作为远程主机的属性来用了。TCP 连接入门当用 TCP 控件创建应用程序的时候,必须首先明确你的程序是作为服务端还是客户端。创建服务端程序就意味着你的程序能够在指定的端口进行“监听” ,而客户端则能够提出请求,服务端能够接受请求并实现连接。一旦连接建立起来,客户端和服务端就能够自由地进行通信。创建服务端程序下面是创建一个简单服务端程序的步骤:创建一个标准 EXE 工程;把默认窗体(Defaul

5、t form)的名字改为 frmServer;把 form 的标题(caption)改为 TCP Server;把 Winsock 控件拉到窗体中,并命名为 tcpServer;在窗体中添加 2 个文本框,分别命名为 txtSendData 和 txtOutput在窗体中加入下列代码;Private Sub Form_Load() Set the LocalPort property to an integer. Then invoke the Listen method.tcpServer.LocalPort = 1001tcpServer.Listen frmClient.Show Sho

6、w the client form.End Sub Private Sub tcpServer_ConnectionRequest _(ByVal requestID As Long) Check if the controls State is closed. If not, close the connection before accepting the new connection.If tcpServer.State 0 Then MsgBox “错误” Exit Function End If Tstatus.dwSize = 160 RetVal = RasGetConnectS

7、tatus(TRasCon(0) .hRasCon,Tstatus) If Tstatus.RasConnState = H2000 Then IsConnected = TRUE Else IsConnected = FALSE End If End Function启动拨号网络中的连接 由于拨号网络不是一个可执行文件, 所以要启动拨号网络,需要借助 explorer.exe 。但若是要启动拨号网络中的某一个连接,则要借助 rundll.exe 和 rnaui.dll 两个文件。启动方法如下(假定此连接名称为 163):Shell “rundll rnaui.dll,RnaDial 163”

8、,vbNormalFocus上面假定了连接名称,但在实际编程中我们是不知道连接名称的。在窗体上放置一个命令按钮(cmdCallConnect) ,在其单击事件中进行连接处理。下面的代码介绍如何取得默认的连接名称并启动它:Option Explicit/*有关的 API 声明*/ Private Declare Function RegOpenKeyEx Lib “advapi32” Alias “RegOpenKeyExA” (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesi

9、red As Long, phkResult As Long) As Long Private Declare Function RegQueryvalueEx Lib “advapi32” Alias “RegQueryvalueExA” (ByVal hKey As Long, ByVal lpvalueName As String, ByVal lpReserved As Long, ByRef lpType As Long, ByVal szData As String, ByRef lpcbData As Long) As Long Private Declare Function

10、RegCloseKey Lib “advapi32”(ByVal hKey As Long) As Long/*常数的设定*/ Const HKEY_CURRENT_USER = H80000001 Const ERROR_SUCCESS = 0在命令按钮(cmdCallConnect) 中加入如下代码:Private Sub cmdCallConnect_Click() /*启动默认拨号连接*/ Shell “rundll rnaui.dll,RnaDial” GetConnect, vbNormalFocus End Sub/*取得连接的函数(GetConnect)*/ Public Fu

11、nction GetConnect() As String Dim hKey As Long Dim SubKey As String /*主键*/ hKey = HKEY_CURRENT_USER /*子键*/ SubKey = “RemoteAccess” /*取得默认连接名*/ GetConnect=GetRegvalue(hKey,SubKey, “Default”) End Function/*取得注册的函数(GetRegvalue)*/ Public Function GetRegvalue(hKey As Long,lpszSubKey As String,szKey As St

12、ring) As Variant On Error GoTo ErrorRoutineErr: Dim phkResult As Long Dim lResult As Long Dim szBuffer As String Dim lBuffSize As Long /*创建缓冲区*/ szBuffer = Space(255) lBuffSize = Len(szBuffer) /*打开注册键*/ RegOpenKeyEx hKey, lpszSubKey, 0, 1,phkResult /*取得查询结果*/ lResult = RegQueryvalueEx(phkResult, szK

13、ey, 0, 0, szBuffer, lBuffSize) /*关闭注册键*/ RegCloseKey phkResult /*返回结果*/ If lResult = ERROR_SUCCESS Then GetRegvalue = Left(szBuffer, lBuffSize 1) Else GetRegvalue =“” End If Exit Function /*意外处理*/ ErrorRoutineErr: GetRegvalue =“” End Function设计 E-mail 的接收部分 在 VB 6 菜单上点击“工程/ 部件.”,弹出“ 部件”对话框,在对话框的控件卡中

14、选中Microsoft MAPI Controls 6.0 控件,点击“ 确定”按钮后,工具箱上增加了 MAPIMessage和 MAPISession 两个图标。在 Form 上加入一个 MAPIMessage 控件,取名为 MAPIMessage1;再加入一个MAPISession 控件,取名为 MAPISession1;再加入三个 TextBox 控件,分别取名为Subject、Content 和 Indexno, 将它们的 Caption 分别改为邮件标题、邮件内容和邮件索引号;在 TextBox 前各加入一个 Label 控件,将 Caption 分别改为标题、内容和索引号。将 MA

15、PIMessage1 的各项属性设置如下:DownLoadMail=TRUE;LogonUI=TRUE;NewSession=FALSE;UserName=“接收 E mail”。在 Form 上加入一个按钮( Getmail),将其 Caption 改为取邮件。在 Getmail_Click()事件中加入以下程序代码,程序的功能是使我们接收 E mail。MAPIMessage1.Fetch Form1.Caption=MAPIMessage1.MsgCount MAPIMessage1.MsgIndex=CINT(Indexno.text) Subject.Text = MAPIMessa

16、ge1.MsgNoteText Content.Text = MAPIMessage1.MsgSubject其中 Fetch 命令用来将信件抓到系统存储器的 inbuffer 中。我们将信件抓回来后,可以通过 MsgCount 属性知道信件数量 ,接着可以用 MsgIndex 设置要看哪一封信件的内容、标题等。设计 E-mail 的发送部分1参数设置进入 Exchange 系统,选择新增设置文件后屏幕上会显示所需要的信息服务,选择Internet Mail。把设置文件的名称设为 test。屏幕会显示两个选项,您可以选择以 Modem 方式或以Network 方式连接。笔者所用的是 Modem

17、方式;假若您是使 Internet 专线,就要选择Network 方式。选择 Modem 方式后,Exchange 会要求我们输入邮件服务器的 IP 地址。接着将Transform Message 的模式设置为 Automatic,这样当我们连接到邮件服务器时,新的信息会自动下载到本地端。接下来,将您所使用的 E mail 地址、全名、口令和下载路径等一一设置好。2程序设计在 Form 上加入一个 MAPIMessage 控件,取名为 MAPIMessage1;加入一个MAPISession 控件,取名为 MAPISession1;并加入三个 TextBox 控件,取名为Subject、Con

18、tent 和 Addr。并在三个 TextBox 前各加入一个 Label,将 Caption 分别改为标题、内容和地址。将 MAPIMessage1 的各项属性设置如下:DownLoadMail=TRUE;LogonUI=TRUE;NewSession=FALSE;UserName=“发送 E mail”。这里将 DownLoadMail 设置为 TRUE,当程序和邮件服务器第一次连接时,会将新的邮件下载到本地端。将 LogonUI 设置为 TRUE,则当您程序中 Logon 名称输入错误时,系统会显示一个 Message Box 来让您输入正确的名称。由于这个程序仅使用一个 Session

19、,所以可将 NewSession 设置成 FALSE。如果您有许多 Session 要建立的话,则将它设置成 TRUE。UserName 中所填的,是我们在Exchange 中所新增的设置文件名称,如果没有填内容的话,系统将会显示一些 Message Box 请您输入文件。在 Form 上加入三个按钮, Logon、Logoff 和 Send,并分别将它们的 Caption 改为登录、离网和发送。在 Logon_Click()事件中加入以下程序代码,程序的功能是使我们登录到邮件服务器:MAPISession1.SignOn MAPIMessage1.SessionID=MAPISession1

20、.SessionID sgBox “Your ID is” Str (MAPISession1.SessionID)其中 MAPISession1.SignOn 是作登录的动作。在登录时,因为已经将MAPIMessage1 控件的 DownLoadMail 属性设置为 TRUE,所以可以在屏幕上看到Message Box,显示系统正在下载邮件。登录成功后,系统会传回一个 SessionID,将该ID 填入 MAPIMessage1 的 SessionID 中,这样就可以利用该 Session 来传送 E mail,同时用 Message Box 通知用户发送成功。在 Logoff_Click(

21、)事件中加入以下程序代码,程序的功能是使我们离开邮件服务器:MAPIS1.SignOff在 Send_Click()事件中加入以下程序代码,程序的功能是使我们发送 E mail:MAPIMessage1.Compose MAPIMessage1.RecipDisplayName = Addr.text MAPIMessage1.AddressResolveUI = TRUE MAPIMessage1.MsgSubject = Subject.text MAPIMessage1.MsgNoteText = Content.text MAPIMessage1.Send MsgBox “您发送成功啦

22、!”其中 Compose 命令的主要目的是使您可以改变 RecipDisplayName 的内容,将所需传送的 E mail 地址、主题和文章内容分别填入 RecipDisplayName、MsgSubject 和MsgNoteText,接着用 Send 命令发送出去b访问 Internet 并调用 Explorer 1实现方法和控件介绍首先在 VB 6 菜单上点击“工程/ 部件.”,弹出“ 部件”对话框,在对话框的控件卡中选中Microsoft Internet Controls 控件,点击“ 确定”按钮后工具箱上增加一个 WebBrowser 图标,将它加到 Form 中。该控件有以下几个

23、重要的方法和事件:GoHome:装入 IE 设定的起始页;Navigate:装入页面,如 Object.Navigate url,其中 url 为 URL 地址,如http:/;GoBack:返回上一个页面;GoForward:进入下一个页面;Stop:停止载入页面;BeforeNavigate Event:在每次装入页面前调用该事件;StatusTextChange Event:每次浏览器的操作状态改变时调用该事件。2具体的访问方法将 WebBrowser 图标添加到 Form 中。并在 Form 上添加 4 个命令按钮,Name 属性分别为:GoButton、BackButton、Forw

24、ardButton 和 StopButton,通过这 4 个命令按钮可以实现对浏览器的操作。在 Form 上添加一个 TextBox 控件,用来输入和显示当前的页面地址。在 Form 上添加一个 Label 控件,用来显示当前浏览器操作状态。/*载入 Form*/ Private Sub Form_Load() /*程序装入后进入 IE 设定的起始页 */ WebBrowser1.GoHome End Sub/*改变 Form 尺寸*/ Private Sub Form_Resize() /*改变窗口大小后同时改变控件的大小*/ WebBrowser1.Width = Form1.ScaleW

25、idth WebBrowser1.Height = Form1.ScaleHeight 900 Label1.Width = Form1.ScaleWidth Label1.Top = Form1.ScaleHeight 300 End SubPrivate Sub BackButton_Click() /*返回上一个页面*/ WebBrowser1.GoBack End SubPrivate Sub ForwardButton_Click() /*进入下一个页面*/ WebBrowser1.GoForward End SubPrivate Sub GoButton_Click() /*浏览输

26、入的页面*/ WebBrowser1.Navigate (Text1.Text) End SubPrivate Sub StopButton_Click() /*停止浏览*/ WebBrowser1.Stop End SubPrivate Sub Text1_KeyPress(KeyAscii As Integer) /*输入地址后进行浏览*/ If KeyAscii = 13 Then WebBrowser1.Navigate (Text1.Text) End If End SubPrivate Sub WebBrowser1_BeforeNavigate(ByVal URL As Stri

27、ng, ByVal Flags As Long, ByVal TargetFrameName As String, PostData As Variant, ByVal Headers As String, Cancel As Boolean) /*将当前显示的页面的 URL 地址显示在 Text1 上*/ Text1.Text = URL End SubPrivate Sub WebBrowser1_StatusTextChange(ByVal Text As String) /*Label1 显示当前页面装入情况*/ Label1.Caption = Text End Sub -VB6 实

28、现局域网多站点互连完全手册随着时代的发展,我们已经步入了信息化时代,网络的普及和应用,使得越来越多的编程人员加入网络软件开发的行列。不过现在对于比较完整的介绍在局域网中多个站点互连的文章,笔者还未见到,这篇文章较完整的介绍了如何利用 Visual Basic 6 的 Winsock控件实现局域网中多个站点在客户机/服务器模式下的互连,并给出了几种连接方案进行比较,对于 Winsock 编程过程中遇到的一些问题做了解答。这里对 Winsock 控件的属性、方法和事件的介绍限于篇幅就不介绍了,下面以最简单的 C/S 模式下一台服务器和一台客户机的连接来说明其整个连接过程。用框图表示如图 1 所示。

29、首先运行服务器端的程序,使 TcpServer 处于监听状态,然后运行客户机端的程序,单击【连接服务器】按钮后,客户机端调用 Connect 方法呼叫服务器(根据 RemoteHostIP 远程计算机 IP 地址和 RemotePort 远程计算机端口号两个参数),然后客户机便处于正在连接服务器状态,等待服务器的响应。客户机调用 Connect 方法触发了服务器 ConnectRequest 事件,这时服务器端可以在此事件中判断是否要接受客户机的请求,如要就调用 Accept 方法,并置标志位说明已成功连接客户机。服务器端调用Accept 方法后又触发了客户机端 Connect 事件,说明服务

30、器端接受客户端的请求,双方已经建立连接了,这时再置客户机端的标志位,这就是一个完整的连接过程。当服务器或客户机调用 Close 方法关闭连接时,都会触发对方的 Close 事件,使其关闭连接。另外建立连接后发送数据的情况是客户机通过调用 SendData 方法发送数据给服务器,会触发服务器端的 DataArrival 事件,在这个事件中,服务器端可以调用 GetData 或 PeekData 方法把客户机发来的数据保存起来。服务器给客户机发信息同理。要注意一点的是,在服务器的 Close 事件中应该加上继续监听的代码,这样客户机才可以继续呼叫服务器。Winsock 控件实现多机互连方案下面是实

31、现多机互连的三种方案。这里以三台机(分别命名为 1 号机、2 号机和 3 号机)为例介绍。方案一:一台机作为服务器,其余两台机作为客户机1 号机作为服务器,用一个 Winsock 控件数组负责监听客户机的呼叫请求并用来与客户机建立连接。用 TcpServer(2)和 TcpServer(3)两个 Winsock 控件数组分别与 2 号机和 3 号机建立连接。这里采用的是动态加载和卸载 Winsock 控件数组来实现连接的,也就是服务器一定要开着,下面的客户机才能与其通过 Winsock 控件实现通讯,当服务器已经与其中的一台建立连接后,其它客户机还要呼叫服务器时,服务器就会加载新的 Winso

32、ck 控件来与其建立连接,当客户机退出连接时,服务器再卸载该 Winsock 控件。服务器建立连接时是根据客户机的 IP 地址来接受响应的,所以可以方便的区分不同客户机的呼叫请求。不过这种方案会遇到一些问题:比如只要服务器关闭,其它客户机之间就无法进行数据交换了,而在服务器开的情况下,可以通过服务器的转发来完成客户机之间的数据交换。方案二:三台机同时作为服务器和客户机1 号机、2 号机和 3 号机没有层次等级之分,采用 C/S 模式。比如 1 号机既可以作为服务器接受其它两台机的呼叫请求,又可以作为客户机对其它两台机进行呼叫。用 1 号机做个比方:在 1 号机程序窗口中用两个 Winsock

33、控件数组,分别命名为 TcpServer 和TcpClient,TcpServer(0 )用来对客户机进行监听,TcpServer (2)和 TcpServer(3)是动态加载用来接受相应的客户机的请求来建立连接的。而 TcpClient(2)和TcpClient(3)不是动态加载的,而是在 Form_Load 初始化过程中加载,用来呼叫相应的服务器。这样也是可以实现多机互连的,不过也有些问题。如果 1 号机作为客户机呼叫 2 号机并已经收到 2 号机的响应建立了一条通讯链路,这时 1 号机又作为服务器接收到 2 号机的呼叫请求,并且也建立了一条通讯链路。这样二台机之间建立了两条链路,理论上两

34、台机只要有一条链路就可以正常通讯,现在建立了两条链路,收发数据是否正常呢?通过测试,收发数据不会出错:当 1 号机给 2 号机发数据时,是通过 1 号机的 TcpServer(2)或TcpClient(2)发送数据给 2 号机,而 2 号机是通过其 TcpClient(1)或 TcpServer(1 )接收 1 号机的数据,双方两条链路互不干扰。不过这种方案还是不太可取,因为加载控件需要占用内存资源,每两台机之间其实只需一条链路就能正常通讯,现在又多了条链路,这对系统有限的资源是极大的浪费。方案三:三台机有差互连先解释一下什么叫有差互连。具体做法是:1 号机只作为服务器监听 2 号和 3 号机

35、的呼叫请求而不呼叫它们;2 号机既是客户机又是服务器:作为客户机只呼叫 1 号机,而作为服务器监听 3 号机的呼叫请求;3 号机只作为客户机对 1 号机和 2 号机进行呼叫,而不具备服务器监听的功能。所以说这几台机的连接是有差的,这种连接方式不会在两台机之间建立两条链路,因为网络中任意两台机只有一台可以呼叫对方或监听对方的呼叫请求,这样无论如何都不会产生两条通讯链路,节省了系统资源,又满足了局域网中任意两台机互连的要求,由此看来这个方案是最优方案。下面介绍方案三的实现过程。1 号机1 号机的窗体(Form)上放置两个 Winsock 控件,一个名为 TcpLsn,负责监听 2 号机和 3 号机

36、的呼叫请求,另外一个为 TcpConn,这是个控件数组,Index 为 2,即已经加载了 TcpConn(2 ),这个控件是为了和 2 号机建立连接。在初始化过程中(Form_Load)设置服务器的监听端口号(TcpLsn.LocalPort)并使其处于监听状态(TcpLsn.Listen),并置与客户机连接成功的标志(TcpConnected 数组,布尔型常量)为 False。当 TcpLsn 监听到某个客户机的呼叫请求后(具体是哪个客户机是根据客户机IP 地址判断),在 TcpLsn 的 ConnectionRequest 事件中动态加载 TcpConn 控件并调用Accept 方法接受客

37、户机的请求,与其建立连接(如果客户机是 2 号机,则无需再加载控件,因为在 Form_Load 中已经加载过了)。要注意的是,TcpLsn 只是用来监听客户机的呼叫请求,而不是用来与客户机建立连接的,TcpConn 控件数组才是与客户机建立连接的。当某一客户机断开连接时,会触发 Tcpconn 控件数组的 Close 事件,在这里可以根据客户机的 IP 地址来调用 Close 方法关闭与其相连的 Tcpconn 控件,并动态卸载之。同样TcpConn(2)不能卸载,因为其不是动态加载的。2 号机2 号机窗体(Form)上也放置两个 Winsock 控件,一个名为 TcpLsn,负责监听 3 号

38、机的呼叫请求,另外一个为 TcpConn,这是个控件数组, Index 为 1,即已经加载了TcpConn(1),这个控件是为了与 1 号机建立连接。在初始化过程中(Form_Load)同样要设置 2 号机作为服务器的监听端口号,然后使其处于监听状态,还要设置与其他几个站点连接成功的标志:TcpConnected(数组)。2 号机作为服务器监听的过程同上,而呼叫 1 号机是通过 VB6 的定时器(Timer)实现的,定时器的作用是每隔一段时间(可自行设定间隔事件)触发 Timer 事件,即执行 Timer 事件中的代码,利用这个原理就可以实现一运行此程序就自动进行呼叫工作,首先将定时器间隔时间

39、定为 1000 毫秒(定时器命名为 TimConn,TimConn.Interval = 1000),然后在定时时间到事件中(TimConn_Timer )调用 TcpConn 的 Connect 方法呼叫 1 号机,当然要加一个判断:当 TcpConnected(1)False 且 TcpConn(1).State=sckClosed 时才进行呼叫。在客户机调用了 TcpConn 方法后,其连接状态是 sckConnecting(正在连接服务器,值为 6)。如果此时 1 号机在一段时间内(连接服务器超时时间)没有接受请求或者根本没有开启,那么就会触发连接错误事件(TcpConn_Error)

40、,这时连接状态是sckError(连接错误,值为 9),就无法再进行连接服务器的工作了,如果 1 号机此时打开,客户机也不会再呼叫服务器了。要解决这个问题,可以在 TcpConn 的错误事件中(TcpConn_Error)加上一条语句: TcpConn(Index ).Close 即在错误事件中关闭当前的连接,使当前 TcpConn 控件状态处于 sckClosed,这样在下一次的定时时间到事件中客户机又能呼叫 1 号机了。呼叫 1 号机成功后,不要忘记在 TcpConn 的 Connect 事件中置连接 1 号机成功的标志位。同样要注意关闭事件中不能卸载 TcpConn(1)。3 号机3 号

41、机在所有站点中只呼叫 1 号机和 2 号机。所以只要一个 Winsock 控件数组即可,命名为 TcpClient,Index1。在程序初始化过程中,加载呼叫服务器的所有 Winsock 控件:Load TcpClient(2)TcpClient(1)已经放在窗体中了,故不必重复加载。还要设置连接成功的标志位(TcpConnected 数组为 False),并设置定时器间隔时间。然后在定时时间到事件中调用TcpClient 的 Connect 方法连接服务器,这与 2 号机作为客户机呼叫服务器的过程类似,同样要在 TcpClient 的连接错误事件中添加以下语句: TcpClient(Inde

42、x ).Close 。要注意的是在服务器的断开连接触发的客户机关闭事件中(TcpClient_Close )只需要置标志位,而不能卸载 TcpClient 控件数组,因为其不是动态加载的。到此为止,基本上实现了运行此程序即进行多机互连的功能。典型问题解析1各个站点建立连接后关闭 3 号机的程序,在其它的站点就会弹出对象已加载的错误提示。出现这个错误的可能原因是 Winsock 控件已经加载,而后又执行了一次加载动作。不过实验证明不是此 Winsock 控件被重复加载。在微软公司的官方网站,VB6 最新的Service Pack 5 补丁(SP5)的说明文档中有这样一条很重要的修正说明:重复加载

43、或卸载 Winsock 控件会引起内存泄露。这一修正是不是可以针对用 Winsock 控件实现网络连接及通讯的程序呢?理论实践证明了这一猜测的真实性。下载完 SP5 并成功安装后,将程序原封不动运行一遍,“对象已加载 ”的错误窗口就再没出现过,这个问题也就成功的解决了。2由于设置了客户机的本地端口号(LocalPort),导致必须先关闭服务器再关闭客户机才能在下一次正常连接以及客户机异常退出时(比如客户机突然停电)导致下次无法正常连接。这是由于没有释放连接端口号造成的。这个错误的解决方法是不要设置客户机的本地端口号;如果非得设置,那么可以利用动态改变服务器监听端口号和客户机呼叫端口号的方法。具体做法是在服务器的 Form_Load 中改变监听端口号,在客户机的Winsock 控件错误事件中改变呼叫端口号,端口号只要用两个就可以了(如 1000 和1001)。来自: http:/ 评论(0) 您需要登录后才能进行评论,点此登录提 交

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报