c# - 判斷ipv6 - 如何檢查輸入IP是否屬於特定IP範圍




c#判斷ipv6 (5)

如果我們讓用戶輸入幾個ip範圍,例如172.16.11.5 - 100,我怎麼能寫一個函數來檢查IP(172.16.11.50)是否屬於範圍?

是否有任何現有的.NET庫可以利用?



here轉發我的答案

不久前,我必須找到給定IP的位置。 我們從請求中獲得了IP。 有免費的數據庫給了我們這個映射。 在IPv4中,當我們將IP稱為“abcd”時,它基本上a * (256^3) + b * (256^2) + c * (256) + d

http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp

所以當你說你想要一個以“a”開頭的IP地址時,你正在尋找一個* 256 ^ 3和一個* 256 ^ 3 + 256 *(256 ^ 2)(b = 256)+ 256 *(256)之間的IP )(c = 256)+ 256(d = 256)(下限/上限可能會略有不同,具體取決於您是否要包含/排除限制)。

也就是說,為特定目的保留了特定的IP(如127.0.0.1,即localhost,0.0.0.0不能是IP等)。

所以你的linq查詢將是

from i in iList where i >= MIN && i <= MAX select i;

其中iList是您的初始列表MIN是您的範圍的最小值MAX是您的範圍的最大值


我以前在codeproject上使用過這段代碼,這可能對你有用。

http://www.codeproject.com/KB/IP/ipnumbers.aspx

您可以向IPList添加由From IP和To IP號定義的一系列IP號。 該方法將範圍分解為標準IP範圍並查找其掩碼。 因此,範圍“10.0.0.5”到“10.0.0.20”將被分解為以下範圍並添加到列表中:10.0.0.5,10.0.0.20,10.0.0.6 / 31,10.0.0.16 / 30和10.0。 0.8 / 29,您將有可能對此進行檢查。

免責聲明:Class僅使用簡單的數據集進行測試,而Class缺乏對所提供的IP號和IP掩碼的驗證。 這應該在生產環境中使用之前修復。


最好是將這些地址轉換為整數,然後執行比較。

示例來自: IP到整數

要將IP地址轉換為整數,請將其分為四個八位字節。 例如,您提供的IP地址可以分為:

First Octet:    217
Second Octet:   110
Third Octet:    18
Fourth Octet:   206

要從虛線字符串計算小數地址,請執行以下計算。

    (first octet * 256³) + (second octet * 256²) + (third octet * 256) + (fourth octet)
=   (first octet * 16777216) + (second octet * 65536) + (third octet * 256) + (fourth octet)
=   (217 * 16777216) + (110 * 65536) + (18 * 256) + (206)
=   3647869646

考慮到IPv6,您可以將它們轉換為整數(128位與32位IPv4)。 看看這個問題:將IPv6格式化為C#中的int並將其存儲在SQL Server中

最簡單的方法是讓框架為您完成此操作。 使用IPAddress.Parse解析地址,然後使用IPAddress.Parse將“number”作為byte[]


public static bool IsInRange(string startIpAddr, string endIpAddr, string address)
{
    long ipStart = BitConverter.ToInt32(IPAddress.Parse(startIpAddr).GetAddressBytes().Reverse().ToArray(), 0);

    long ipEnd = BitConverter.ToInt32(IPAddress.Parse(endIpAddr).GetAddressBytes().Reverse().ToArray(), 0);

    long ip = BitConverter.ToInt32(IPAddress.Parse(address).GetAddressBytes().Reverse().ToArray(), 0);

    return ip >= ipStart && ip <= ipEnd; //edited
}

Console.WriteLine(IsInRange("100.0.0.1", "110.0.0.255", "102.0.0.4"));//true




asp.net