您现在的位置是: 首页 > 软件更新 软件更新

winsock控件的功能_winsock控件主要用来编制基于

tamoadmin 2024-09-06 人已围观

简介1.VB winsock控件如何实现多台远程计算机远程相互连接,要有具体实例2.Winsock1(0).Listen3.关于vb6的winsock控件一次性传递数据大小的问题。4.什么是WinSock25.如何使用VB Winsock控件6.vb用Winsock控件怎么发送与接收字符串数组呀,我互相传送好多数据。自己改下就可以了Private Sub Command1_Click() Wins

1.VB winsock控件如何实现多台远程计算机远程相互连接,要有具体实例

2.Winsock1(0).Listen

3.关于vb6的winsock控件一次性传递数据大小的问题。

4.什么是WinSock2

5.如何使用VB Winsock控件

6.vb用Winsock控件怎么发送与接收字符串数组呀,我互相传送好多数据。

winsock控件的功能_winsock控件主要用来编制基于

自己改下就可以了

Private Sub Command1_Click()

Winsock1.SendData txtSend.Text

End Sub

Private Sub Form_Load()

Dim my As String

Winsock1.Protocol = sckUDPProtocol '设置为UDP协义

Winsock1.LocalPort = 10 '随便设置,不过两个要一样

Winsock1.RemotePort = 10

my = Winsock1.LocalIP '取得自己的IP地址,是不要的

Winsock1.RemoteHost = my '这里应该是设置为别人计算机的IP地址,由于自己是单机,所以就设置成自己的,自己给自己发信息

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '取得数据时发生

Dim Tmp As String

Winsock1.GetData Tmp, vbString '取得数据

Tmp = "对方位址:" + Winsock1.RemoteHostIP + "发言内容为-->" + Tmp

txtMess.Text = Tmp + Chr$(13) + Chr$(10) + txtMess.Text

End Sub

VB winsock控件如何实现多台远程计算机远程相互连接,要有具体实例

通信程序通常都是用Client/Server形式。这就要求作为服务器的主机可以同时处理多个客户的请求。因此在编写服务器程序时要添加多个Winsock控件。在开始我们先加入两个Winsock控件。其中一个用来侦听网上请求信号,取名为Listener;另外一个为初始的连接口,取名叫Sock(0)。注意,后一个控件要设为动态数组的形式,以后当客户增多时,可在这个控件基础上动态增加。由于受限制,我们在本例中设定最多可以同时接纳15个客户。客户机一般只与一个主机相连,因此程序只须一个Winsock进行连接就足够了。这个程序要用到的控件较少,除了Winsock和Form控件外,只须再添加Commmand控件即可。下面是具体程序和详细注释。

******************************

服务器程序

******************************

Option Explicit

定义常量

Const BUSY As Boolean = False

Const FREE As Boolean = True

定义连接状态

Dim ConnectState() As Boolean

Private Sub Form_Load()

ReDim Preserve ConnectState(0 To 1)

On Error Resume Next

ConnectState(0) = FREE

ConnectState(1) = FREE

’指定网络端口号

Listener.LocalPort = 1011

‘开始侦听

Listener.Listen

End Sub

Private Sub Listener_ConnectionRequest(ByVal requestID As Long)

Dim SockIndex As Integer

Dim SockNum As Integer

On Error Resume Next

Form1.Print requestID & "连接请求"

查找连接的用户数

SockNum = UBound(ConnectState)

If SockNum > 14 Then

Form1.Print SockIndex & ""

Exit Sub

End If

查找空闲的sock

SockIndex = FindFreeSocket()

’如果已有的sock都忙,而且sock数不超过15个,动态添加sock

If SockIndex > SockNum Then

Load Sock(SockIndex)

End If

ConnectState(SockIndex) = BUSY

Sock(SockIndex).Tag = SockIndex

接受请求

Sock(SockIndex).Accept (requestID)

Form1.Print SockIndex & "接受请求"

End Sub

客户断开,关闭相应的sock

Private Sub Sock_Close(Index As Integer)

If Sock(Index).State <> sckClosed Then

Sock(Index).Close

End If

ConnectState(Index) = FREE

Form1.Print Index & "close"

End Sub

接收数据

Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)

Dim dx As Double

Form1.Print "数据来自" & Index

Sock(Index).GetData dx, vbDouble

Form1.Print "dx=" & dx

End Sub

寻找空闲的sock

Public Function FindFreeSocket()

Dim SockCount, i As Integer

SockCount = UBound(ConnectState)

For i = 0 To SockCount

If ConnectState(i) = FREE Then

FindFreeSocket = i

Exit Function

End Ifs

Next i

ReDim Preserve ConnectState(0 To SockCount + 1)

FindFreeSocket = UBound(ConnectState)

End Function

***************************

客户程序

’***************************

Option Explicit

发送数据

Private Sub command1_Click()

Dim dx As Double

dx = 23.9

sock.SendData dx

MsgBox ("data sended")

End Sub

Private Sub Form_Load()

远程主机名

sock.RemoteHost = "media2"

网络端口

sock.RemotePort = 1011

发出连接命令

sock.Connect

Command1.Enabled = False

End Sub

服务器关闭

Private Sub sock_Close()

MsgBox ("socket closed")

End Sub

连接成功

Private Sub sock_Connect()

MsgBox ("socket connected")

Command1.Enabled = True

End Sub

Winsock1(0).Listen

程控制功能是基于客户机/服务器这一模型来实现的,所以程序的编制也应分两部分进行:一部分是服务器端--也就是被控制的一方,另一部分是客户端--控制方。服务器程序要守侯在一个固定或不固定的网址(IP)上等待客户程序的请求;客户程序则向服务器程序所在的网址请求连接,连接成功后通过交换信息即可得到相应的服务。因此设置Winsock属性时,服务器端应设置LocalPort和应用Listen方法进行监听,客户程序则要设置RemoteHost和RemotePort及应用Connect方法请求连接,并用Senddata方法互换信息。下面是Winsock控件的相关属性,方法和。(略去一些暂用不到的)

*属性

-------------------------------------------------------------------------

LocalHostName | 本地机器名

LocalIP | 本地机器IP地址

LocalPort | 本地机器通信程序的端口(0<端口<65536)

RemoteHost | 远程机器名

RemotePort | 远程机器的通信程序端口

state | 连接的当前状态(文后有详细说明)

Protocal | 使用TCP或UDP协议(这里我们选‘0-sckTCPProtocal’)

--------------------------------------------------------------------------

*方法

--------------------------------------------------------------------------

Listen

Listen方法用于服务器程序,等待客户访问。

格式:Winsock对象.listen

Connect

Connect方法用于向远程主机发出连接请求

格式:Winsock对象.connect [远程主机IP,远程端口]

Accept

Accept方法用于接受一个连接请求

格式:Winsock对象.accept Request ID

Senddata

此方法用于发送数据

格式:Winsock对象.senddata 数据

Getdata

用来取得接收到的数据

格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]]

Close

关闭当前连接

格式:Winsock对象.close

*

----------------------------------------------------------------------------

Close | 远程机器关闭连接时触发

Connect | 连接建立好,可以进行通信时触发(客户端)

ConnectRequest | 有请求连接到达时产生(服务器端)

DataArrival | 有数据到达时触发

Error | 发生错误时发生

SendProgress | 数据传送进度

-----------------------------------------------------------------------------

程序代码如下:

--》服务器端程序(server.exe)

先在窗体中放置Winsock控件(他在运行时是看不见的),属性用默认值,再设置Form1的属性ShowInTaskBar为False,Visible为False(这样才有隐蔽性嘛).对于程序的自启动可手工在注册表“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”中增加键值"winserver"="c:\\windows\\server.exe"或配置文件Win.ini的Load,run写入"C:\windows\server.exe"来达到目的。当然也可通过在VB5中调用API函数来实现对注册表的写入,这就更方便了,不过由于实现过程较复杂,就不在这里说了.

Private Sub Form_Load()

On Error GoTo skip 注释:如此端口已有通信程序则退出

Winsock1.LocalPort = 1334 注释:端口值应大于,如还有冲突可改为其他值

Winsock1.Listen

Exit Sub

skip:

If Err.Number = 10048 Then

MsgBox "端口冲突,退出!", vbOKOnly, "注意!"

End

End If

End Sub

Private Sub Winsock1_Close()

If Winsock1.State <> sckClosed Then Winsock1.Close

Winsock1.Listen 注释:关闭连接后继续监听

End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

If Winsock1.State <> sckClosed Then Winsock1.Close

Winsock1.Accept requestID 注释:请求到达时,接受连接

End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim strget As String

Dim ccom As String

Winsock1.GetData strget 注释:读取到达的数据

Select Case strget

Case "a" 注释:判断到达的数据是否‘a’,是则重启,你也可自己定义(协议就是这样产生的)

ccom = curr_win() + "\RUNDLL.EXE user.exe,exitwindowec" 注释:不同机器设置不一样

Call Shell(ccom, vbHide) 注释:由函数curr_win()来判断

Case "b" 注释:如为‘b’则关闭计算机

ccom = curr_win() + "\RUNDLL.EXE user.exe,exitwindows"

Call Shell(ccom, vbHide) 注释:函数shell来执行命令

Case Else 注释:可以在此加入其他命令

End Select

End Sub

Function curr_win() As String

Dim i As Integer

Dim enstr As String

i = 1 注释:此函数通过读取环境变量来获得Windows目录

enstr = Environ(i)

Do While enstr <> ""

If Len(enstr) > 11 Then

If Left(enstr, 11) = "winbootdir=" Then

curr_win = Right(enstr, Len(enstr) - 11)

Exit Do

End If

End If

i = i + 1

enstr = Environ(i)

Loop

End Function

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal

Scode As Long, ByVal Source As String, ByVal HelpFile As String,

ByVal HelpContext As Long, CancelDisplay As Boolean)

MsgBox "错误", vbOKOnly, "注意!" 注释:如程序出现错误,则简单的退出

End

End Sub

关于vb6的winsock控件一次性传递数据大小的问题。

Winsock是Windows Socket的缩写,用来实现在程序中连接网络,Listen()是Winsock控件的一个方法,当设置好Winsock控件的端口号和IP地址后就可以调用这个方法实现在本地指定端口上开始监听,从你给出的那一句来看应该是使用了一个控件数组,执行这条指令后编号为0(数组下标为0)的Winsock控件就开始执行监听并等待连接。

这是VB编写局域网聊天软件服务器端的一种方法,一个Winsock控件监听端口获得聊天数据,另一组Winsock控件把数据发送到每个客户端上以达到广播。

什么是WinSock2

Winsock 主要是以TCP或UDP传输数据的,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,传输层,应用层.UDP属于运输层。

下面由下至上一步一步来看:

以太网 (Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.这个1500字节被称为链路层的MTU(最大传输单元).但这并不是指链路层的长度被限制在1500字节,其实这个MTU指的是链路层的数据区.并不包括链路层的首部和尾部的18个字节.所以,事实上,这个1500字节就是网络层IP数据报的长度限制.因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.这个1472字节就是我们可以使用的字节数。

当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于 MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报。

另外,数据限制也存在两个因素:

第一,应用程序可能会受到其程序接口的限制。socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报(使用这个默认值是因为8192是NFS读写用户数据数的默认值)。

第二个限制来自于TCP/IP的内核实现。可能存在一些实现特性(或差错),使IP数据报长度小于65535字节。

如何使用VB Winsock控件

分类: 电脑/网络 >> 操作系统/系统故障

解析:

winsock2是你系统当前使用的winsock的版本,最开始的windows系统使用的是winsock1版本,后来开发的则使用winsock2.

这个是网络上用的,是系统中使用的网络组织控件,他的功能是完成所有网络的连接。

一个简单的例子,你玩网络游戏时,游戏要连接服务器用的就是winsock,拆开来分析winsock中的win代表的是windows,就是windows系统,sock英文意思是短袜,喻意是一对的意思,所以凡是网络连接都是一对进行的,一边是客户一边是服务器。

vb用Winsock控件怎么发送与接收字符串数组呀,我互相传送好多数据。

使用 Winsock 控件步骤:

一)选择通讯协议

在使用 WinSock 控件时,首先需要考虑使用什么协议。可以使用的协议包括 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?=?1001

tcpServer.Listen?

frmClient.Show?'显示客户端的窗体。

End?Sub

Private?Sub?tcpServer_ConnectionRequest?_

(ByVal?requestID?As?Long)

'检查控件的?State?属性是否为关闭的。

'如果不是,

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

If?tcpServer.State?<>?sckClosed?Then?_

tcpServer.Close

'接受具有?requestID?参数的

'连接。

tcpServer.Accept?requestID

End?Sub

Private?Sub?txtSendData_Change()

'名为?txtSendData?的?TextBox?控件中

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

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

'发送输入的字符串。

tcpServer.SendData?txtSendData.Text

End?Sub

Private?Sub?tcpServer_DataArrival?_

(ByVal?bytesTotal?As?Long)

'为进入的数据声明一个变量。

'调用?GetData?方法,并将数据赋予名为?txtOutput?

'的?TextBox?的?Text?属性。

Dim?strData?As?String

tcpServer.GetData?strData

txtOutput.Text?=?strData

End?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?=?1001

End?Sub

Private?Sub?cmdConnect_Click()

'调用?Connect?方法,初始化连接。

tcpClient.Connect

End?Sub

Private?Sub?txtSendData_Change()

tcpClient.SendData?txtSend.Text

End?Sub

Private?Sub?tcpClient_DataArrival?_

(ByVal?bytesTotal?As?Long)

Dim?strData?As?String

tcpClient.GetData?strData

txtOutput.Text?=?strData

End?Sub

上面的代码创建了一个简单的客户/服务器模式的应用程序。我们可以将两者都运行起来:运行工程,然后单击“连接”。在两个窗体之一的 txtSendData 文本框中键入文本,可以看到同样的文字将出现在另一个窗体的 txtOutput 文本框中。

七)Winsock 控件

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 方法来获取已发送的信息。

将字符串数组合并成一个字符串,两个字符串之间用一个字符或字符串隔开。传输。

接收到的是一个字符串,用split函数分割成原来的字符串就可以了。

发送端:字符串数组A(10)

Dim s As String

For i = 0 To 10

s = s & "||"

Next

发送

接收端:收到字符串SR

Dim b() As String

b = Split(sr, "||")

OK,完成了