1. 程式人生 > >VB實現自動取得伺服器IP並連線伺服器(利用UDP廣播)

VB實現自動取得伺服器IP並連線伺服器(利用UDP廣播)

普通的講解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