您的位置 首页 > 电脑系统

winsock控件无法接收数据_winsock connect

1.为什么用winsock控件传输数据的时候会出现乱码

2.跪求!!EXCEL高手请进~~~~VBA中的Winsock控件的使用问题

3.关于VB Winsock控件的错误问题

4.Winsock的接收、发送数据

5.关于winsock的几个简单问题

6.关于winsock控件senddata 返回错误

7.用VB编写一个即时通讯软件的具体过程和代码

winsock控件无法接收数据_winsock connect

虽然很久没用这控件了,不过原理还是懂的,给你点思路吧

解决你的问题,大概有几个方法:

一.控制发送速度,简单但是效率有点低

二.技术方加大数据缓冲,优先接收,读了就放内存里,接收完或是空闲时再处理,这在处理过程复杂时比较有效

三.出错的数据丢掉----没错,就是不要了!

既然你选择了UDP,就无法避免丢包的事情发生,肯定要有相关的容错处理.网络可以"自动"丢包,我们写的程序为什么不能"人为"丢包呢?

其实,多数情况下,要根据所处理数据的特点 当前网络特点 机器现状来制定策略,综合上述办法,甚至创造更新的办法

以上,希望对你有帮助,还有问题欢迎探讨

为什么用winsock控件传输数据的时候会出现乱码

使用 Winsock 控件

利用 WinSock 控件可以与远程计算机建立连接,并通过用户数据文报协议 (UDP)或者传输控制协议

(TCP)进行数据交换。这两种协议都可以用来创建客户与服务器应用程序。与 Timer 控件类似,WinSock 控件在运行时是不可见的。

可能的用途

创建收集用户信息的客户端应用程序,并将收集的信息发送到某中央服务器。

创建一个服务器应用程序,作为多个用户的数据的汇入点。

创建“聊天”应用程序。

选择通讯协议

在使用 WinSock 控件时,首先需要考虑使用什么协议。可以使用的协议包括 TCP 和 UDP。两种协议之间的重要区别在于它们的连接状态:

TCP 协议控件是基于连接的协议,可以将它同电话系统相比。在开始数据传输之前,用户必须先建立连接。

UDP

协议是一种无连接协议,两台计算机之间的传输类似于传递邮件:消息从一台计算机发送到另一台计算机,但是两者之间没有明确的连接。另外,单次传输的最大数据量取决于具体的网络。

到底选择哪一种协议通常是由需要创建的应用程序决定的。下面的几个问题将有助于选择适宜的协议:

在收发数据的时候,应用程序是否需要得到客户端或者服务器的确认信息?如果需要,使用 TCP 协议,在收发数据之前先建立明确的连接。

数据量是否特别大(例如图象与声音文件)?在连接建立之后,TCP

协议将维护连接并确保数据的完整性。不过,这种连接需要更多的计算,因而是比较“昂贵”的。

数据发送是间歇的,还是在一个会话内?例如,如果应用程序在某个任务完成的时候需要通知某个计算机,UDP 协议是更适宜的。UDP 协议适合发送少量的数据。

协议的设置

在设计时,可以按如下方式设置应用程序使用的协议:在“属性”窗口中单击“协议”,然后选择 sckTCPProtocol 或者

sckUDPProtocol。也可以使用程序代码来设置 Protocol 属性,如下所示:

Winsock1.Protocol = sckTCPProtocol

确定计算机的名称

在与远程计算机相连接的时候,需要知道它的 IP 地址或者它的“好听的名字”。IP 地址是一串数字,每三个数字为一组,中间用点隔开(形如

xxx.xxx.xxx.xxx)。通常,最易记住的是计算机的“好听的名字”。

要确定计算机的名字,请按照以下步骤执行:

在计算机的“任务栏”上,单击“启动”。

在“设置”项中,单击“控制面板”。

双击“网络”图标。

单击“标识”选项卡。

在“计算机名称”框中可以找到计算机的名称。

上面找到的计算机名称可以作为 RemoteHost 属性的值。

TCP 连接初步

===========

如果应用程序要使用 TCP

协议,那么首先必须决定应用程序是服务器还是客户端。如果要创建一个服务器端,那么应用程序需要“监听”指定的端口。当客户端提出连接请求时,服务器端能够接受请求并建立连接。在连接建立之后,客户端与服务器端可以自由地互相通讯。

下列步骤创建一个非常简单的服务器:

要创建一个 TCP 服务器,请按照以下步骤执行:

创建新的 Standard EXE 工程。

将缺省窗体的名称改为 frmServer。

将窗体的标题改为“TCP 服务器”。

在窗体中放入一个 Winsock 控件,并将它的名字改为 tcpServer。

在窗体上添加两个 TextBox 控件。将第一个命名为 txtSendData,第二个为 txtOutput。

为窗体添加如下的代码。 Private Sub Form_Load()

'将 LocalPort 属性设置为一个整数。

'然后调用 Listen 方法。

tcpServer.LocalPort = 1001tcpServer.Listen frmClient.Show '显示客户端的窗体。

End SubPrivate Sub tcpServer_ConnectionRequest _(ByVal requestID As Long)'检查控件的 State 属性是否为关闭的。

'如果不是,

'在接受新的连接之前先关闭此连接。

If tcpServer.State <> sckClosed Then _tcpServer.Close'接受具有 requestID 参数的

'连接。

tcpServer.Accept requestIDEnd SubPrivate Sub txtSendData_Change()'名为 txtSendData 的 TextBox 控件中

'包含了要发送的数据。当用户往文本框中

'键入数据时,使用 SendData 方法

'发送输入的字符串。

tcpServer.SendData txtSendData.TextEnd SubPrivate Sub tcpServer_DataArrival _(ByVal bytesTotal As Long)'为进入的数据声明一个变量。

'调用 GetData 方法,并将数据赋予名为 txtOutput '的 TextBox 的 Text 属性。

Dim strData As StringtcpServer.GetData strDatatxtOutput.Text = strDataEnd Sub

上面的步骤创建了一个简单的服务器应用程序。为了使它能够工作,还必须为它创建一个客户端的应用程序。

要创建 TCP 客户端,请按照以下步骤执行:

在工程中添加一个新的窗体,将其命名为 frmClient。

将窗体的标题改为“TCP Client”。

在窗体中添加一个 Winsock 控件,并将其命名为 tcpClient。

在 frmClient 中添加两个 TextBox 控件。将第一个命名为 txtSend,第二个为 txtOutput。

在窗体上放一个 CommandButton 控件,并将其命名为 cmdConnect。

将 CommandButton 控件的标题改为 Connect。

在窗体中添加如下的代码。

重点 必须将 RemoteHost 属性值修改为您的计算机的名字。

Private Sub Form_Load()

'Winsock 控件的名字为 tcpClient。

'注意:要指定远程主机,可以使用

' IP 地址(例如:"121.111.1.1"),也可以使用

'计算机的“好听的名字”如下所示。

tcpClient.RemoteHost = "RemoteComputerName" tcpClient.RemotePort = 1001End SubPrivate Sub cmdConnect_Click() '调用 Connect 方法,初始化连接。

tcpClient.ConnectEnd SubPrivate Sub txtSendData_Change() tcpClient.SendData txtSend.TextEnd SubPrivate Sub tcpClient_DataArrival _(ByVal bytesTotal As Long) Dim strData As String tcpClient.GetData strData txtOutput.Text = strDataEnd Sub

上面的代码创建了一个简单的客户/服务器模式的应用程序。我们可以将两者都运行起来:运行工程,然后单击“连接”。在两个窗体之一的 txtSendData

文本框中键入文本,可以看到同样的文字将出现在另一个窗体的 txtOutput 文本框中。

UDP 初步

========

创建 UDP 应用程序比创建 TCP 应用程序还要简单,因为 UDP 协议不需要显式的连接。在上面的 TCP 应用程序中,一个 Winsock

控件必须显式地进行“监听”,另一个必须使用 Connect 方法初始化连接。

UDP 协议不需要显式的连接。要在两个控件中间发送数据,需要完成以下的三步(在连接的双方):

将 RemoteHost 属性设置为另一台计算机的名称。

将 RemotePort 属性设置为第二个控件的 LocalPort 属性。

调用 Bind 方法,指定使用的 LocalPort。(下面将详细地讨论该方法。)

因为两台计算机的地位可以看成“平等的”,这种应用程序也被称为点到点的。为了具体说明这个问题,下面将创建一个“聊天”应用程序,两个人可以通过它进行实时的交谈。

要创建一个 UDP 伙伴,请按照以下步骤执行:

创建一个新的 Standard EXE 工程。

将缺省的窗体的名称修改为 frmPeerA。

将窗体的标题修改为“Peer A”。

在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerA。

在“属性”页上,单击“协议”并将协议修改为 UDPProtocol。

在窗体中添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。

为窗体增加如下的代码。 Private Sub Form_Load()

'控件的名字为 udpPeerAWith udpPeerA'重点:必须将 RemoteHost 的值

'修改为计算机的名字。

.RemoteHost= "PeerB" .RemotePort = 1001 '连接的端口号。

.Bind 1002 '绑定到本地的端口。

End WithfrmPeerB.Show '显示第二个窗体。

End SubPrivate Sub txtSend_Change()'在键入文本时,立即将其发送出去。

udpPeerA.SendData txtSend.TextEnd SubPrivate Sub udpPeerA_DataArrival _(ByVal bytesTotal As Long)Dim strData As StringudpPeerA.GetData strDatatxtOutput.Text = strDataEnd Sub

要创建第二个 UDP 伙伴,请按照以下步骤执行:

在工程中添加一个标准窗体。

将窗体的名字修改为 frmPeerB。

将窗体的标题修改为“Peer B”。

在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerB。

在“属性”页上,单击“协议”并将协议修改为“UDPProtocol”。

在窗体上添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。

在窗体中添加如下的代码。 Private Sub Form_Load()

'控件的名字为 udpPeerB。

With udpPeerB'重点:必须将 RemoteHost 的值改为

'计算机的名字。

.RemoteHost= "PeerA".RemotePort = 1002 '要连接的端口。

.Bind 1001 '绑定到本地的端口上。

End WithEnd SubPrivate Sub txtSend_Change()'在键入后立即发送文本。

udpPeerB.SendData txtSend.TextEnd SubPrivate Sub udpPeerB_DataArrival _(ByVal bytesTotal As Long)Dim strData As StringudpPeerB.GetData strDatatxtOutput.Text = strDataEnd Sub

如果要试用上面的例子,按 F5 键运行工程,然后在两个窗体的 txtSend TextBox 中分别键入一些文本。键入的文字将出现在另一个窗体的

txtOutput TextBox 中。

跪求!!EXCEL高手请进~~~~VBA中的Winsock控件的使用问题

打开你的字符串缓冲区,用二进制方式看看究竟传回来的是什么内容,

通常这类情况与接收和发送的缓冲区不匹配有关系,导致字符串被异常截断,但是你的现象是乱码,可能是服务器根本没有把你需要的字符串正常打包传送。

另外还建议查一下是否有大小端的问题,可能服务器是按大端来发数据,但是客户端却会按小端来收。上网去找winsock的文档仔细阅读下比较好。

关于VB Winsock控件的错误问题

受影响的控件有MSCOMCT2、Mscomm32、MSDataGrid、MlexGrid、MSWinsock。也就是说如果你在使用VB、VBA开发的时候,在添加某一控件的时候,出现上述画面中的提示,那么下面的内容可以帮你解决这一问题。 一、原因 为什么会出现上述提示,因为在VB(包含VBA)中的AcitveX控件的漏洞可能允许远程执行代码,请情参看MS08-070。 微软为了封堵这一漏洞便发布补丁KB960715,而这一补丁的作用是将上面提到的这些控件给禁用了,这就是添加此类控件时出现错误提示的原因。 二、临时解决方案 如果在一个脱机(没有网络)的开发环境中,临时的解决方案便是将KB960715补丁卸载(如果删除了补丁卸载信息,可重新安装一次该补丁或从别的机器中复制卸载需要的文件,然后再卸载),然后再添加这些控件。 但此解决方案存在弊端,下次自动更新重新装上KB960715补丁时,故障又会重现。 三、完美解决方案 在KB960715之后,微软发布了新的补丁(VB6 SP6的累积更新KB957924)解决了这一问题。 首先我们看一下微软是如何封堵这一漏洞的吧(Q2407)。 针对VB环境 1.下载并安装VB SP6。 2.下载并安装VB6 SP6的累积更新KB957924(VB6 SP6的累积更新的汇总说明)。 3.将控件重新拖拽一次,然后重新编译发布。 针对VBA环境 1.下载并安装VB SP6。 2.下载并安装VB6 SP6的累积更新KB957924(VB6 SP6的累积更新的汇总说明)。 3.电脑中搜索扩展名为“.exd”的文件(控件的缓存文件,需要在高级选项中选择“搜索隐藏的文件和文件夹”),然后将其删除。 4.将控件重新拖拽。 特别说明:如果机器中没有安装VB,则VB SP6是无法安装的,当然其累积更新也就无法安装。具体的解决办法是可以先在一台装有VB的电脑上安装这些补丁,然后将相应的控件文件复制到开发环境的那台机器的(systemroot\windows\system32)路径下覆盖旧版文件,并使用Regsvr32进行控件注册即可。

Winsock的接收、发送数据

10014产生的原因,请检查Winsock的各个属性设置。10054错误一般是远程连接出现问题被重置,可能要从监听端口那一方去查原因。

sckOutOfMemory 7 内存不足

sckInvalidPropertyValue 380 属性值不效

sckGetNotSupported 394 属性不可读

sckGetNotSupported 383 属性是只读的

sckBadState 40006 所请求的事务或请求本身的错误协议或者错误连接状态

sckInvalidArg 40014 传递给函数的参数格式不确定,或者不在指定范围内

sckSuclearcase ccess 40017 成功

sckUnsupported 40018 不支持的变量类型

sckInvalidOp 40020 在当前状态下的无效操作

sckOutOfRange 40021 参数越界

sckWrongProtocol 40026 所请求的事务或请求本身的错误协议

sckOpCanceled 10004 取消操作

sckInvalidArgument 10014 所请求的地址是广播地址,但未设置标记

sckWouldBlock 10035 套接字不成块,而指定操作将使之成块

sckInProgress 10036 制造块的Winsock操作在进行之中

sckAlreadyComplete 10037 完成操作。未进行制作块的操作

sckNotSocket 10038 描述符不是套接字

sckMsgTooBig 10040 数据太大,不适于缓冲区的要求,因而被截断

sckPortNotSupported 10043 不支持指定的端口

sckAddressInUse 10048 地址在使用中

sckAddressNotAvailable 10049 来自本地机器的不可用地址

sckNetworkSubsystemFailed 10050 网络子系统失败

sckNetworkUnreachable 10051 当前不能从主机到达网络

sckNetReset 10052 在设置SO_KEEPALIVE时连接超时

sckConnectAborted 10053 由于超时或者其它失败而中止接连

sckConnectionReset 10054 通过远端重新设置连接

sckNoBufferSpace 10055 没有可用的缓存空间

sckAlreadyConnected 10056 已连接的套接字

sckNotConnected 10057 未接连套接字

sckSockedShutdown 10058 已关闭套接字

sckTimedout 10060 套接字超时

sckConnectionRefused 10061 强行拒绝连接

sckNotInitialized 10093 套接字没有初始化

sckHostNotFound 11001 授权应答:未找到主机

sckHostNotFoundTryAgain 11002 非授权应答:未找到主机,重试

sckNonRecoverableError 11003 不可恢复的错误

sckNoData 11004 无效名,对所请求的类型无数据记录

关于winsock的几个简单问题

差别大了。dll是activex dll就好比是一个动态dll文件。如果不设置不能访问函数。改了可以。activex控件是用户控件。自己做控件。然后加载就可以独立运行。不需要外部。winsock需要这个msock.ocx忘记名字了。需要这个控件。否则别人不能使用。左边的那些都是基本控件。都不需要带。。webbrowser也不需要带。

winsock。。

流程。。。。

接受getdate

发送senddate

5分就这么多了。

关于winsock控件senddata 返回错误

Winsock控件

Winsock控件对用户是不可视的,可以很容易地访问TCP和UDP网络服务。其可以被Microsoft Access, Visual Basic ,Visual C++或Visual FoxPro开发人员使用。要编写客户和服务器应用程序,不需要了解TCP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。

属性

BytesReceived属性,LocalHostName属性,LocalIP属性,LocalPort属性,RemoteHost属性(ActiveX控件),SocketHandle属性,State属性(Winsock控件),Protocol属性(Winsock控件),Name属性,Parent属性,RemoteHost属性(ActiveX控件),RemotePort属性(ActiveX控件),Index属性(ActiveX控件),Tag属性(ActiveX控件),Object属性(ActiveX控件)。

方法

Accept方法,Bind方法,Close方法(Winsock控件),Listen方法,PeerData方法,SendData方法,GetData方法(WinSock控件),GetData方法(ActiveX控件)。

Close,ConnectionRequest,DataArrival,SendComplete,SendProgress,Error,Connect(Winsock控件),Connect。

Winsock 控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的开发人员都可使用它。为编写客户或服务器应用程序,不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。

TCP 基础

数据传输协议允许创建和维护与远程计算机的连接。连接两台计算机就可彼此进行数据传输。

如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。

如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 。为了完成连接,可调用 ConnectionRequest 内的 Accept 方法。

建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。当接收数据时会发生 DataArrival 。调用 DataArrival 内的 GetData 方法就可获取数据。

UDP 基础

用户数据文报协议 (UDP) 是一个无连接协议。跟 TCP 的操作不同,计算机并不建立连接。另外 UDP 应用程序可以是客户机,也可以是服务器。

为了传输数据,首先要设置客户计算机的 LocalPort 属性。然后,服务器计算机只需将 RemoteHost 设置为客户计算机的 Internet 地址,并将 RemotePort 属性设置为跟客户计算机的 LocalPort 属性相同的端口,并调用 SendData 方法来着手发送信息。于是,客户计算机使用 DataArrival 内的 GetData 方法来获取已发送的信息。

用VB编写一个即时通讯软件的具体过程和代码

你这个错误与Winsock没有关系吧,这是与WEB的PHP通信的应答代码。

用Winsock进行Web通信倒是没有问题,但要控制数据量。每个数据包是有尺寸限制的,如果你发送或接收的数据量超过了一个数据包规定的字节数,它会自动拆开分多次发送。因此你的Winsock代码里必须有判断数据传输完成的代码部分。

对于web访问来说,我建议你不要用Winsock发送请求和获得应答,数据量小你可以用Inet控件,数据量大可以用Webbrowser。你的这个功能用这两个控件轻松完成,何必非要用Winsock呢。一般我们用Winsock是用来处理传输自己编写的服务器与客户端程序用,对于这种标准的web尤其是协议通信,只要用现成控件即可。

利用Winsock控件实现局域网通信

对于局域网用户中的编程爱好者来说,如果能自己编一个局域网通信程序,那么这一切将是多么美妙!可是,如果要从头开始完全由自己来编写一段用于通信的程序,必须对相关的网络协议及其他的一些较底层的技术有较深入的了解,这可不是一件容易的事。而现在有了Winsock控件,一切就不同了,它已经替你封装了所有烦琐的技术细节,并提供了访问TCP和UDP网络服务的方便途径。你只需通过设置控件的属性并调用其方法就可轻易连接到一台远程计算机中,并且还可以双向交换数据,而这一切都不需你了解TCP的细节或调用低级的Winsock APIs。

Winsock控件可以供Microsoft Acess、Visual Basic,Visual C++或Visual Foxpro的开发人员使用。本文以Visual Basic 6企业版为开发环境来向大家介绍一下Winsock控件的初步应用。

Winsock控件可以使用两种协议:TCP协议和UDP协议,下面来分别介绍。

TCP协议即数据传输协议,它允许创建和维护与远程计算机的连接,使其彼此可以进行数据传输。利用TCP协议通讯必须分别建立客户应用程序和服务器应用程序。

在创建客户应用程序时,必须知道服务器计算机名或其IP地址(存于RemoteHost属性)、及服务器计算机进行侦听的端口(存于RemotePort属性),然后调用Connect方法。

创建服务器应用程序时,就应相应设置一个侦听端口(LocalPort属性)并调用listen方法。当客户机需要连接时(connect),就会发生ConnectionRequest。为了完成连接,你可以在ConnectionRequest中调用Accept方法。建立连接后,任何一方计算机都可以发送、接收对方数据。如果你要发送数据,需调用SendData方法。当接收到数据时,会发生DataArrival,调用DataArrival中的GetData方法就可以获得对方传送的数据。

说了这么多,大家可能还是不太了解,让我用程序来详细说明。

如果只有两台计算机,那十分容易。设甲机为客户机,乙机为服务器,且其IP为192.192.192.1,接收端口为1200(任意选一个未被使用的端口即可)。首先在甲机客户端程序中加入一个Winsock控件,起名为sckconnect,并设置其属性:RemoteHost=“192.192.192.1”,(即甲机IP地址), RemotePort=1200(即甲机侦听端口);再在乙机服务器程序中如一个名为sckserver(0)的Winsock控件,其LocalPort=1200,

在乙机服务器程序中Form_Load()加入

sckserver(0).bind sckserver(0).LocalPort '与本地端口绑定

sckserver(0).listern ' 侦听

如果要传输数据,两机必须先建立连接。建立连接的程序如下:

甲机客户机要先请求连接

sckconnect.connect sckconnect.RemoteHost, sckconnect.RemotePort

此句执行时会触发服务器程序中的ConnectRequest,在此过程中决定是否建立连接,其代码如下:

Private sub sckserver_connectionrequest(index as Integer,Byval requestid as long)

if sckserver.count=1 then

load sckserver(1)

sckserver(1).accept requestId

end if

end sub

连接建立好以后,甲机或乙机都可以应用SendData方法来传送数据。例如,如果是甲机要传送一个叫string的字符串,只需在代码中加入:

sckconnect.SendData string

甲机传送数据后,会触发乙机的DataArrival,在其过程中用GetData方法可以收到传送的数据:

Private sub sckserver_DataArrival(Index as integer,Byval BytesTotal as long)

dim sdata as string

sckserver(1).GetData sdata,vbstring

end sub

最后别忘了在关闭程序前要先关闭Winsock控件

privat sub form_unload(cancel as integer)

if sckconnect.state <>sckclosed then

sckconnect.close

end if

end sub

 

这只是最简单的情况,如果有多台计算机,那就稍微复杂一些,客户端程序可以不做改动,而服务器端程序需要略做改动:

Private sub sckserver_connectrequest(Index as Integer,Byval requestid as long)

dim sip as string

dim I as integer

sip=sckserver(0).RemoteHostIP '获得登录者的IP地址

I=1

Do while I<=sckserver.ubound '检查是否已经有该地址的记录

If sckserver(I).RemoteHostIP=sip then '如有,不必加载新的控件

Sckserver(I).Accept requestid

Exit sub

End if

I=I+1

Loop

Load sckserver(I) '否则,加载新的控件

Scksrver(I).accept requestID

End sub

注意到:以上的信息交谈实际上都发生在客户机与服务器之间,如果要做成聊天室那样,每个人的话都可以被别人“听到”,那就要在服务器端的DataArrival中,把接收到的客户机传来的数据,转发给所有客户机即可。

其循环转发信息的代码如下:

For I=1 to sckserver.count

if sckserver(I).state<>sckclosed then

sckserver(I).SendData sdata

end if

next I

 

怎么样,这样我们就作好了自己的通信软件!

 

不过,不知大家注意到没有,上述程序都需要有一台计算机做为服务器,但如果我们的局域网中没有哪台计算机是可以常开的,也就是说,如果服务器端程序没有运行的话,其他客户端程序也没有办法通信。而这种情况却可能是经常出现的!至少,我所用的局域网那就是这样的。难道这样我们就无法享受局域网通信的乐趣了吗?

不要急,记得吗,我们的Winsock控件还有另一个主角:UDP协议。

UDP协议也称为用户数据报文协议,是一个无连接协议。何谓无连接协议?就是说利用此协议连接时,不必象TCP协议那样:需要服务器端侦听,客户机端请求连接,服务器端建立连接后双方才能通信。另外,UDP应用程序可以是客户机,也可以是服务器程序,而不必向TCP应用程序那样必须分别建立客户机程序和服务器程序。

下面,来简述一下UDP协议通信的过程:UDP协议中,为了在甲乙两机中传输数据,必须先分别设置两机的LocalPort属性;再将甲机的RemoteHost属性设置为乙机的IP地址,RemotePort属性设置为乙机的LocalPort属性值,此时甲机调用SendData方法就可以传送数据了,乙机同样使用DataArrival中的GetData方法来获取甲机发送给乙机的信息。如想乙机向甲机传送数据,只需仿照上面的过程设置即可。

用UDP协议来传输信息较TCP协议来说简单的多,它无须侦听(LISTEN),也无须请求连接(CONNECT),就象我们平时发信一样,只要写好地址及收信人姓名并发送出去即可。我们可以借此来编写一个局域网中的信息传送程序,下面来简单介绍以下程序中想实现的功能及其基本思想:

首先,我们一定想让程序的图标显示在system tray中而不显示在任务栏中吧!这要是自己编程实现可不是太容易,幸好VB光盘中在common\tools\vb\unsupport\systemTray 中有一个现成的程序,我们只要把它编译成systray.ocx 控件,然后在编写自己的程序时添加此控件即可。其使用方法十分简单,它已经定义好了鼠标单击、双击等,你只需编写相应的鼠标即可,这里不再多说。

程序的关键是:UDP协议在通讯时要知道对方的IP和Port,这要如何实现呢?最简单的方法是建立一个配置文件,里面放置了局域网上每台计算机的名字、IP和Port,在程序初始化时读出所有信息,在程序中只要知道向谁通信,读出其对应的IP和Port即可。

我们知道了每台计算机的IP和Port,但我们怎样才能知道其它计算机是否在线呢,否则发出信息别人收不到怎么办?我们可以把此程序放在启动菜单中,让其一开机就自动启动,并最小化,放于窗口右下角的system tray中。在程序刚开始运行时,它会自动向它从配置文件中所知道的所有IP发一条信息:“我来了!”,如果有计算机在线,它会自动返回一条信息:“欢迎!”,如此则两机通信成功,它们会分别把对方的名字加入到自己的可通信人名单中去;如果有计算机关机,程序在退出之前会自动向所有人告别:“再见!”,接收到此信息的计算机会自动把发送信息的计算机的名称从自己的可通信人名单中去除。这样,如果某人不在线,你将无法发送信息给它;如果除了你以外,其他人都没有开机,那你的可发送人名单中将没有任何人。而其它人只要一上线,会自动去你那里“登记”,其他人只要一离线,会自动去你那里“告别”,你可以据此知道他人是否正在使用计算机,你甚至可以以此程序来统计他人的每天上机时间,不错吧!

好了,一个局域网通信的程序的基本模型已经有了,并不复杂吧!大家赶快动手吧,来享受用自己的程序来聊天的乐趣!

不过,要想编写一个出色的程序,不光是要有良好的创意与功能,更重要的是程序的兼容性与容错性。本例中,对错误处理没有做详细的解释,关于这一点,大家可以在Winsock控件的error及其帮助中找到满意的答案。

另外,还可以从以下几方面来考虑功能的扩充:如传送图形、声音等多媒体信息、局域网互传文件(主动传送)、历史通话记录、系统日志、个人上机时间统计等等,而所有的这一切仅仅取决于你的想象力与你的聪明才智!下面,笔者以传送文件为例来讲一讲其功能实现的代码。

你可以把本地的文件(图形、声音等可以先存成临时文件)以二进制文件的方式来打开它,将其内容全部读入一个byte类型的数组中,本地机代码如下:

dim myfile () as byte

dim position as long

open "filename" for binary as #1

position=0

do while not eof(1)

position=positon+1

redim preserve myfile (1 to position)

get #1,,myfile(position)

loop

close #1

再向远程机传送这个字节数组

sckserver.SendData myfile

远程机收到这个数组之后,再以二进制文件的方式打开一个新目标文件,将数组内容写入这个新打开的文件,如果是bmp就将其放入picture框中,如果是w文件,就播放。这样,局域网中的两个人就可以通过语言、、文字来交流了。

远程机代码如下:

Private sub sckconnect_DataArrival(byval bytestotal as long)

dim receivefile(1 to bytestotal)as byte

sckconnect.GetData receivefile,vbarray+vbbyte

'告诉Winsock控件收到的是字节数组类型的数据

open "c:\temp\文件名" for binary as #1

for I=1 to bytestotal

put #1,,remotearray(I)

next I

clost #1

end sub

热门文章