[转]VB实现自动取得服务器IP并连接服务器(利用UDP广播)

最近在用VB写多用户类型的远程控制,转个文章做思路……

转自: http://www.ibiancheng.cn/Article/VBNetArticle/200804/123.html

普通的讲解WINSOCK控件等网络控件的用法的资料中,无论是使用TCP还是UDP,客户端程序连接服务端程序时,无一例外的要指定IP地址(或机器名)和端口号,那么,在端口已知而服务端程序所在机器地址或名称未知的情况下,怎样实现客户端程序自动取得服务端IP并建立连接呢,笔者在实际编程中遇到了这种情况,并使用以下方法解决了这个问题。
这种方法就是服务器端添加两个Winsock控件,一个作为服务端,一个以UDP来广播本机IP,客户端也用UDP方式取得服务器IP,然后再将客户端改为TCP方式来向服务器发起连接。完整代码如下:

' 服务器端程序加代码(程序出处www.ibiancheng.cn)
'
新建一个工程,然后在窗体上放两个个Winsock控件,名为Winsock1和Winsock2
'
一个定时器控件Timer1,Interval属性设置为1000(也可以自己设置)
'
---------------------向整个网络广播本机IP---------------------------
Dim MeIp  As  String     ' 储存本机IP
Dim netmask  As  String     ' 储存本机广播地址
Dim maxconnext  As  Long
Dim nowconnext()  As  Boolean
' ---------------------------------------------------------
Private  Sub Form_Load()
    Winsock1.Protocol = sckUDPProtocol
    Winsock1.RemotePort =  9400    ' 绑顶远程端口号9400
    MeIp = Winsock1.LocalIP      ' 获得本机IP地址
    netmask =  " 127.0.0.255 "      ' 为本机广播地址,广播地址请按自己的IP计算
     ' -----------------------------------------
    Winsock2( 0).LocalPort =  1001
    Winsock2( 0).Listen
End Sub
' -----------------------开始向整个网络广播本机IP--------------------------
Private  Sub Timer1_Timer()        ' 向本网广播地址发送信息
Winsock1.RemoteHost = netmask    ' 向本网广播地址发送信息,内容是本机的IP地址
Winsock1.SendData MeIp
End Sub
Private  Sub Winsock2_Close(Index  As  Integer)
     Winsock2(Index).Close
     Winsock2(Index).LocalPort =  1001
     Winsock2(Index).Listen
End Sub
' 服务器端收到客户端的连接请求,这里的代码可能有点问题,请自己重新写或联系我
Private  Sub Winsock2_ConnectionRequest(Index  As  Integer, ByVal requestID  As  Long)
On  Error  Resume  Next
Dim i  As  Long
If Index =  0  Then  ' 主Winsock——Winsock(0)发生消息
    i =  1
     While i <= maxconnext  And nowconnext(i)  ' 在以前的Winsock中找到空闲的Winsock
        i = i +  1
        DoEvents
     Wend
     If i <= maxconnext  Then  ' 在当前装载的Socket中发现有用户已经离开
        Winsock2(i).LocalPort =  0  ' 使用现成的Socket
        Winsock2(i).Accept requestID  ' 接收
        nowconnext(i) =  True  ' Winsock(i)被占用
     Else  ' 在当前装载的Socket中没发现有用户离开
        maxconnext = maxconnext +  1  ' 当前接收端口增加
        Load Winsock2(maxconnext)  ' 生成新的’ Winsock
        Winsock2(maxconnext).LocalPort =  0
        Winsock2(maxconnext).Accept requestID  ' 接收
         ReDim Preserve nowconnext(maxconnext +  1)
        nowconnext(maxconnext) =  True
     End  If
End  If
End Sub
' -------------------------------------------------------
'
客户端程序(程序出处www.ibiancheng.cn)
'
新建一个工程,然后在窗体上放一个Winsock控件,名为Winsock1
'
-----------------------------
Dim CanSend  As  String      ' 保存服务端IP
'
----------------------------
Private  Sub Form_Load()
' --------------------------------------
Winsock1.Protocol = sckUDPProtocol    ' 初始化连接方式
Winsock1.Bind  " 9400 "  ' 从9400端口侦听
'
----------------------------------------
Winsock2.RemoteHost =  " 1001 "
End Sub
' -----------------------------------------------------------
Private  Sub Winsock1_DataArrival(ByVal bytesTotal  As  Long)
    DoEvents
     Dim DataArrival  As  String
     Dim Cip          As  String
    Winsock1.GetData DataArrival
    CanSend = DataArrival      ' 取得服务端IP
    Winsock1.Close       ' 断开连接
    Winsock1.LocalPort =  0  ' 改端口号为0
    Winsock1.Protocol = sckTCPProtocol     '  改变连接方式
    Winsock1.RemotePort =  1001            ' 设置服务器端口号
    Winsock1.RemoteHost = CanSend         ' 请求连接服务器
    Winsock1.Connect
End Sub

 

主要用到的方法就是UDP广播

本文结束,原理粗浅望能起抛砖引玉之用。

转载于:https://www.cnblogs.com/findw/archive/2012/10/12/2721072.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值