Noob's Space

VB.Net 取得廣播位址、子網路遮罩、內部 IP

大部分的教學都在說明如何取得內部 IP 、預設閘道和子網路遮罩,好像還沒看過怎麼找廣播位址的。不過什麼時候需要用到廣播位址呢?當然是你想廣播的時候啊 XD

好啦,其實是因為雖然已經過了很久,我還在玩上次的 Wake-On-Lan (網路喚醒),寫了一隻 Android App 和 VB.Net 程式來互相溝通,當電腦找不到手機的時候,就只能先廣播來取得位址了。但是廣播位址要怎麼算呢?

稍微參考了一下這篇文章,據說廣播位址只要利用內部 IP 和子網路遮罩就可以計算出來了!

先來看看要怎麼找到內部 IP。其實在 System.Net.Dns 下面就有方法可以直接取得內部 IP 了,不過卻無法取得子網路遮罩,所以以下以 Win32_NetworkAdapterConfiguration 這個 API 來取得內部 IP 和子網路遮罩。

首先請將 System.Management 加入參考

Reference

接著以下是 Code:

        Dim SubnetMaskAddr As String
        Dim LocalAddr As String
        Dim mc As New Management.ManagementClass("Win32_NetworkAdapterConfiguration")
        Dim nics As Management.ManagementObjectCollection
        nics = mc.GetInstances()
        Dim nic As Management.ManagementObject
        For Each nic In nics
            If nic("ipEnabled") = True Then
                Dim s As String
                For Each s In nic("IPAddress")
                    LocalAddr = s.ToString
                    Exit For
                Next
                For Each s In nic("IPSubnet")
                    SubnetMaskAddr = s.ToString
                    Exit For
                Next
            End If
        Next

查看更多有關 Win32_NetworkAdapterConfiguration 資料,可以上 MSDN

取得內部 IP 和子網路遮罩後該怎麼計算廣播位址呢?這邊的做法是先把內部 IP 位址和子網路遮罩做 OR 運算後,再和 255 做 XOR 運算。

但首先我們要把 IP 的點拿掉,並把字串轉成數字。這裡以陣列儲存分割後的 IP。

        Dim LocalAddrArray() = LocalAddr.Split({"."c}, StringSplitOptions.RemoveEmptyEntries)
        Dim SubnetMaskAddrArray() = SubnetMaskAddr.Split({"."c}, StringSplitOptions.RemoveEmptyEntries)
        Dim BroadcastAddrAray(4)
        For i As Integer = 0 To 3
            Dim nrBCOct As Integer = Integer.Parse(LocalAddrArray(i)) Or (Integer.Parse(SubnetMaskAddrArray(i)) Xor 255)
            BroadcastAddrAray(i) = (nrBCOct.ToString())
        Next

接著再把它組回字串吧!

        Dim BroadcastAddr = BroadcastAddrAray(0) + "." + BroadcastAddrAray(1) + "." + BroadcastAddrAray(2) + "." + BroadcastAddrAray(3)

這樣就是廣播位址了!

你可能會有興趣......?

廣告