zoukankan      html  css  js  c++  java
  • [转]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广播

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

  • 相关阅读:
    时间选择器和日期选择器
    paip.c++ qt 项目工程互相引用的方法
    leetcode_question_85 Largest Rectangle in Histogram
    在VirtualBox虚拟机上采集Fedora15系统
    Oracle
    VC6.0调试大全
    oracle中的exists 和not exists 用法详解
    vi常用命令
    【虚拟化实战】容灾设计之四VPLEX
    CentOS6.3 安装配置 ant
  • 原文地址:https://www.cnblogs.com/findw/p/2721072.html
Copyright © 2011-2022 走看看