用VB创建自己的通信程序

用VB创建自己的通信程序,第1张

Winsock控件建立在TCP、UDP的协议基础上,以完成计算机网络间的通信。下面将详细的介绍具体的程序创建过程,以便使大家更好的理解程序的源代码。

服务器端程序的运行过程是:

(1)服务器端要设置好侦听端口即LocalPort属性,作为侦听端口的值必须是一个整数(一定要是其它TCP/IP应用程序没有用过的值,并且不能与系统缺省端口冲突)。

(2)用Listen方法进入侦听状态,等待客户机的连接请求。

(3)当客户机发出连接请求时,使服务器产生一个ConnectionRequest事件,且该事件得到一个参数equestID。

(4)服务器程序用Accept方法接受客户机requestID请求。这样,服务器程序便可以用SendData方法来发送数据了。但是,Accept方法必须用上一个步得到的requestID作为其参数。

(5)当服务器程序接收到数据时,便会产生一个DataArrial事件,参数BytesTotal包含接收到的数据字节数。在该事件中,可以用GetData方法接收数据。

(6)如果接收到Close事件,则用Close方法关闭TCP/IP连接。

客户机的程序的运行过程是:

(1)在客户程序中设置Remmotehost属性,以便指定运行服务器程序的主机名,该字符串可以在服务器“ 控制面板 网络 标识 计算机”中查到。

(2)设置RemotePort属性,以便指定服务器程序的侦听端口(其设置方法与服务器端类似)。

(3)使用Connect方法,向服务器提出连接请求。

(4)当服务器程序接受到客户机程序的请求后,客户机程序产生Connect事件,就可以用SendData方法发送数据了。

(5)当客户机程序接收到数据时,便会产生DataArrival事件,参数BytesTotal包含接收到的数据字节数。类似的在该事件中也可以用GetData方法接收数据。

(6)如果客户机程序接收到Close,则用Close方法关闭连接。

使用说明:

本程序实现了两台计算机之间的自由通信。先将编译好的程序分别放入两台已联网的计算机的 开始 启动 中,这样每次启动时,程序将会自动运行,程序启动时将以最小化的形式出现在任务栏中,当用户使用时可以通过点击任务栏上的该程序图标来激活该程序,一方将程序激活后,在“请输入所要连接的主机名:“右侧的我框中输入需要连接的计算机名,并敲“连接”键便可连接成功。此时在“接收窗口:”下的我框中将会出现“连接成功”的提示。然后就可以在“发送窗口:”下的我框中输入要说的话了,输入完毕后敲“发送”键后便可使另一方收到你的话了,如果另一方的程序尚未正常化,那么另一方程序将发出提示音并使任务栏中程序的图标闪烁,直到另一方将程序激活为正常化并与你对话为止。如果暂时停止对话可以点击该程序的极小化按钮将程序最小化,一旦需要再次通话可直接激活该程序发送过去,如果另一方的程序尚未正常化,那么程序仍将发出提示音并使开使栏中程序的小图标闪烁,直到另一方将程序正常化并与你对话为止。所以,无论什么时候想与对方通话只要对方开了机便可以实现。当需要断开连接时请按“关闭”键,该程序能自动发送结束消息,使对方能够知道你已断开连接,以结束程序运行。

如果你知道连接的名称,例如“连接到163”或“ADSL”,那么这段程序就可以运行了,不过你可不能保证你的用户机器上有同样的连接名称,所以还必须要使用一段API函数来枚举所有的可用拨号连接名称才行。

新建一个VB

Project,在Form1中做以下声明:

Private

Const

RAS_MaxDeviceType

=

16

Private

Const

RAS95_MaxDeviceName

=

128

Private

Const

RAS95_MaxEntryName

=

256

Private

Type

RASCONN95

dwSize

As

Long

hRasConn

As

Long

szEntryName(RAS95_MaxEntryName)

As

Byte

szDeviceType(RAS_MaxDeviceType)

As

Byte

szDeviceName(RAS95_MaxDeviceName)

As

Byte

End

Type

Private

Type

RASENTRYNAME95

dwSize

As

Long

szEntryName(RAS95_MaxEntryName)

As

Byte

End

Type

Private

Declare

Function

RasEnumConnections

Lib

"RasApi32.DLL"

Alias

"RasEnumConnectionsA"

(lprasconn

As

Any,

lpcb

As

Long,

lpcConnections

As

Long)

As

Long

Private

Declare

Function

RasEnumEntries

Lib

"RasApi32.DLL"

Alias

"RasEnumEntriesA"

(ByVal

reserved

As

String,

ByVal

lpszPhonebook

As

String,

lprasentryname

As

Any,

lpcb

As

Long,

lpcEntries

As

Long)

As

Long

Private

Declare

Function

RasHangUp

Lib

"rasapi32.dll"

Alias

_

"RasHangUpA"

(ByVal

hRasConn

As

Long)

As

Long

在Form上放一个ListBox或者ComboBox,然后在Form_Load中写入以下代码把当前可用的拨号连接名称加进去,这里我们使用ListBox。

Private

Sub

Form_Load()

Dim

s

As

Long,

l

As

Long,

ln

As

Long,

a$

ReDim

R(255)

As

RASENTRYNAME95

R(0).dwSize

=

264

s

=

256

*

R(0).dwSize

l

=

RasEnumEntries(vbNullString,

vbNullString,

R(0),

s,

ln)

For

l

=

0

To

ln

-

1

a$

=

StrConv(R(l).szEntryName(),

vbUnicode)

List1.AddItem

Left$(a$,

InStr(a$,

Chr$(0))

-

1)

Next

List1.ListIndex

=

0

End

Sub

好,现在你就可以运行一下了,ListBox中应该把当前所有的拨号连接名称都显示出来了。

下面再往Form上加一个命令按钮,Caption设为“Connect”。输入以下代码:

Private

Sub

Command1_Click()

Dim

cmd

As

String

cmd

=

"rundll

rnaui.dll,RnaDial

"

&

List1.List(List1.ListIndex)

Shell

cmd$,

vbNormalFocus

End

Sub

这段程序从ListBox获得选择的拨号连接名称,然后调用RunDLL建立拨号连接。如果已经建立连接,它将显示拨号连接的状态。如果你不想让对话框出现,再添一行代码上去:

DoEvents:SendKeys

"{enter}",

True

它将发送一个回车键到当前窗口,相当于用户按了“确认”按钮。

如何挂断当前的连接

我们继续在上面的基础上讲解,挂断连接要用到RasHangUp函数,我们在上面声明部分已经写过了。

再向Form1添加一个按钮Command2,Caption设为Disconnect,输入如下的代码:

Private

Sub

Command2_Click()

Dim

s

As

Long,

l

As

Long,

ln

As

Long,

a$,

RasConn

As

Long,

Ret

As

Long

b$

=

List1.List(List1.ListIndex)

ReDim

R(255)

As

RASCONN95

R(0).dwSize

=

412

s

=

256

*

R(0).dwSize

l

=

RasEnumConnections(R(0),

s,

ln)

For

l

=

0

To

ln

-

1

a$

=

StrConv(R(l).szEntryName(),

vbUnicode)

a$

=

Left$(a$,

InStr(a$,

Chr$(0))

-

1)

RasConn

=

R(l).hRasConn

'这里将挂断连接

Ret

=

RasHangUp(ByVal

RasConn)

Next

End

Sub

这段代码枚举当前所有的连接,并且把它挂断,如果你有双猫,三猫(没有这么好的条件吧),它将把所有连接都挂断。

如何判断当前是否连接到Internet

以前部分网站介绍过读取Registry来判断是否连接到Internet的方法,不过笔者认为这种方法不是最健壮,这里还是在上面的基础上用RasEnumConnections来判断某个连接是否已经连上线了。

再向Form1添加一个按钮Command3,Caption设为Status,输入如下的代码:

Private

Sub

Command2_Click()

Dim

s

As

Long,

l

As

Long,

ln

As

Long,

a$,

b$

b$

=

List1.List(List1.ListIndex)

ReDim

R(255)

As

RASCONN95

R(0).dwSize

=

412

s

=

256

*

R(0).dwSize

l

=

RasEnumConnections(R(0),

s,

ln)

For

l

=

0

To

ln

-

1

a$

=

StrConv(R(l).szEntryName(),

vbUnicode)

a$

=

Left$(a$,

InStr(a$,

Chr$(0))

-

1)

If

a$

=

b$

Then

MsgBox

"Connected

(or

connecting)!":

Exit

Sub

Next

MsgBox

"Not

Connected!"

End

Sub

本段代码判断ListBox当前选中的连接是否已经连接成功或者正在连接之中,并给出相应的信息。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11558080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存