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

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

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

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

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

首先請將 System.Management 加入參考

接著以下是 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)

這樣就是廣播位址了!