C# 獲取局域網下的設備IP範圍

我們連接的WIFI,屬性設置裏有自動分配IP的選項。

我們通過控制檯輸入ipconfig,看到當前IP是10.214.18.178

 那自動分配IP範圍是多少?路由器對IP是怎麼分配的。下面是我整理的code,有需要的可以直接Copy

IP範圍獲取:

1     private void RefreshButton_OnClick(object sender, RoutedEventArgs e)
2     {
3         var maxSubIp = GetMaxSubIp("10.214.18.1", "255.255.254.0");
4         SubNetIpTextBlock.Text = $"10.214.18.1-{maxSubIp}";
5     }

通過子網掩碼及默認網關,獲取路由可分配的最大IP:

我們將子網掩碼轉換爲二進制數據,11111111111111111111111000000000,這裏的1表示固定IP,0表示可分配的動態IP。

再將默認網關也轉換爲二進制數據,如00101000001101011010010010100000,將這個分成倆段:
“001010000011010110100100”,即上面子網掩碼固定長度的部分,我們定義個名稱A,分配的IP固定部分就是這部分A

“10100000”,是上面子網掩碼動態長度的部分。IP動態段,最低的值就是這個。

所以我們要算出動態IP段的最高值即可。最高值就是二進制全部是1:“11111111”

然後改將二進制數據,轉換爲十進制的IP地址,就拿到我們動態IP的最大值了。

 1     /// <summary>
 2     /// 獲取局域網下最大IP
 3     /// </summary>
 4     /// <param name="defaultGateway">默認網關</param>
 5     /// <param name="subNetMask">子網掩碼</param>
 6     private string GetMaxSubIp(string defaultGateway, string subNetMask)
 7     {
 8         var subNetBinary = ConvertIpToBinary(subNetMask);
 9         if (!subNetBinary.EndsWith("0"))
10         {
11             return string.Empty;
12         }
13         var existIndex = subNetBinary.IndexOf("0", StringComparison.Ordinal);
14         var gatewayBinary = ConvertIpToBinary(defaultGateway);
15         var maxIpLeft = gatewayBinary.Substring(0, existIndex);
16 
17         //最大的子網IP
18         var maxSubIpBinary = maxIpLeft.PadRight(32, '1');
19         var maxSubIp = ConvertBinaryToIp(maxSubIpBinary);
20         return maxSubIp;
21     }

IP與二進制間的轉換:

 1     /// <summary>
 2     /// 將二進制數據轉爲IP
 3     /// </summary>
 4     /// <param name="ipBinaryData">IP二進制數據,如:00001010110101100001001000000001</param>
 5     /// <returns>IP地址,如:10.214.18.1</returns>
 6     private string ConvertBinaryToIp(string ipBinaryData)
 7     {
 8         var item1 = Convert.ToInt32(ipBinaryData.Substring(0, 8), 2);
 9         var item2 = Convert.ToInt32(ipBinaryData.Substring(8, 8), 2);
10         var item3 = Convert.ToInt32(ipBinaryData.Substring(16, 8), 2);
11         var item4 = Convert.ToInt32(ipBinaryData.Substring(24, 8), 2);
12         return $"{item1}.{item2}.{item3}.{item4}";
13     }
14 
15     /// <summary>
16     /// 將IP轉爲二進制數據
17     /// </summary>
18     /// <param name="ipAddress">IP地址,如:10.214.18.1</param>
19     /// <returns>IP二進制數據,如:00001010110101100001001000000001</returns>
20     private string ConvertIpToBinary(string ipAddress)
21     {
22         var items = ipAddress.Split('.');
23         var stringBuilder = new StringBuilder();
24         foreach (var item in items)
25         {
26             var binary = Convert.ToString(int.Parse(item), 2);
27             var ipPieceBinary = binary.PadLeft(8, '0');
28             stringBuilder.Append(ipPieceBinary);
29         }
30         return stringBuilder.ToString();
31     }

所以在上面案例中,子網掩碼255.255.254.0,默認網關10.214.18.1,這個網絡的IP範圍是:10.214.18.1-10.214.19.255

 

參考:

(25條消息) npm 獲取某個網段下所有的子網_子網掩碼與IP地址之間有什麼關係?_weixin_39833429的博客-CSDN博客

C# 進制之間轉換(二進制、十進制、十六進制) - 知乎 (zhihu.com)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章