|
|
在VB中实现客户端程序自动查找并连接服务端程序 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
在VB中实现客户端程序自动查找并连接服务端程序 (南京审计学院教育技术中心 210029 丁国勇) 在一般的讲解WINSOCK控件的用法的文章中,无论是使用TCP还是UDP,客户端程序连接服务端程序时无一例外的要指定IP地址(或机器名)和端口号,那么,在端口已知而服务端程序所在机器地址或名称未知的情况下,怎样实现客户端程序发起并建立连接呢,笔者在实际编程中遇到了这种情况,并使用如下方法解决了这个问题。 这种方法巧妙的将 TCP与UDP结合起来,概括起来就是UDP查找,TCP连接。 对于客户端程序,使用了三个WINSOCK 控件: 1 sockclient 协议sckTcpprotocol 用于向服务端程序发起TCP连接 2 socklink 协议sckUdpprotocol 用于向本网广播地址发送数据 3 sockgetdata 协议sckUdpprotocol 用于接受从服务端程序返回的信息 定义一个String类型全局变量 MeIp,用于存放本机的IP地址。 在Form_load()事件中,编写如下程序: Dim netbcaddress As String MeIp = socklink.LocalIP 获得本机IP地址 netmask存放本网的广播地址, 假设IP地址为192.168.100.215,子网掩码为255.255.255.0 则该网的广播地址即为192.168.100.255,从本机IP地址怎样得到 广播地址请读者自己考虑。 sockgetdata.Bind "9400" ' 绑定到本地端口9400 socklink.RemoteHost = netmask '向本网广播地址发送信息,内容是本机的IP地址 socklink.RemotePort = 9401 socklink.SendData "dgy.." & MeIp 在sockgetdata的DataArrival里这样定义 Private Sub sockgetdata_DataArrival(ByVal bytesTotal As Long) Dim StrData As String sockgetdata.GetData StrData '取得数据,数据为服务端程序所在机器的IP地址 If Trim(StrData) <> "" Then sockclient.RemoteHost = StrData '客户端程序与服务端程序建立连接。 sockclient.RemotePort = 8092 sockclient.Connect End If End Sub 在服务端程序中,则要从广播地址获得客户端的IP地址,并将自己的IP地址发送到客户端,让客户 端与自己建立连接. 服务端程序中,同样也用到如下三个winsock控件: 1 sockserver控件数组 协议sckTcpprotocol 用于接受客户端的TCP连接 2 sockgetdata 协议sckUdpprotocol 用于从广播地址获得客户端的IP地址 3 sockudpsend 协议sckUdpprotocol 用于向客户端发送服务端程序的IP地址 在Form_load()中 sockgetdata.Bind "9401" '从9401端口侦听 定义如下结构和函数用于分离数据 Option Explicit Private Type UdpData ok As Boolean IP As String End Type Private Function UdpDataSwitch(UdpData As String) As UdpData Dim p As String Dim MyStrs As Variant Dim strs As Variant p = "" MyStrs = Split(UdpData, "..") For Each strs In MyStrs If p = "dgy" Then UdpDataSwitch.ok = True UdpDataSwitch.IP = strs Exit Function End If p = strs Next UdpDataSwitch.ok = False UdpDataSwitch.IP = "" End Function 在sockgetdata的DataArrival事件中 Private Sub sockgetdata_DataArrival(ByVal bytesTotal As Long) DoEvents Dim DataArrival As String Dim CanSend As Boolean Dim Cip As String sockudplink.GetData DataArrival CanSend = UdpDataSwitch(DataArrival).ok If CanSend = True Then sockudpsend.RemoteHost = UdpDataSwitch(DataArrival).IP sockudpsend.RemotePort =9400 sockudpsend.SendData sockudpsend.LocalIP End If End Sub 至于sockserver 怎样响应sockclient 的连接请求,看一般的介绍winsock编程的文章就可以 得到答案。 这样,就能完成在端口已知而服务端程序所在机器地址或名称未知的情况下,巧妙使用UDP和TCP,完成客户端程序与服务端程序的连接。 关于在VB中怎样得到本机所在网络的广播地址(特别是在动态获得IP地址的情况下),欢迎大家来信与我探讨 [email protected] 
|
|
相关文章:相关软件: |
|