VB實現自動取得伺服器IP並連線伺服器(利用UDP廣播)
阿新 • • 發佈:2019-01-06
普通的講解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