C#實現判斷一個IP是否是指定範圍內的IP

來源:互聯網
上載者:User


 //定義允許的IP端,格式如下

static string[] AllowIPRanges = { "10.0.0.0-10.255.255.255", "172.16.0.0-172.31.255.255", "192.168.0.0-192.168.255.255" };//主函數,調用判斷介面
static void Main(string[] args) { //判斷192.168.100.0這個ip是否在指定的IP範圍段內
//就這個範圍而言,如果把IP轉換成long型的 那麼192.167.0.0這個IP 將在10.0.0.0-10.255.255.255這個範圍內,但實際上這是錯誤的。還希望高手指點將ip轉換為long的內幕
Console.WriteLine(TheIpIsRange("192.169.100.0", AllowIPRanges));
Console.WriteLine("Done"); Console.Read(); } //介面函數 參數分別是你要判斷的IP 和 你允許的IP範圍//(已經重載)
//(允許同時指定多個數組)
static bool TheIpIsRange(string ip, params string[] ranges) { bool tmpRes = false; foreach (var item in ranges) { if (TheIpIsRange(ip, item)) { tmpRes = true; break; } } return tmpRes; } /// <summary> /// 判斷指定的IP是否在指定的IP範圍內 這裡只能指定一個範圍
/// </summary> /// <param name="ip"></param> /// <param name="ranges"></param> /// <returns></returns> static bool TheIpIsRange(string ip, string ranges) { bool result = false; int count; string start_ip, end_ip;        //檢測指定的IP範圍 是否合法
TryParseRanges(ranges,out count,out start_ip,out end_ip);//檢測ip範圍格式是否有效 if (ip == "::1") ip = "127.0.0.1"; try { IPAddress.Parse(ip);//判斷指定要判斷的IP是否合法
} catch (Exception) { throw new ApplicationException("要檢測的IP地址無效"); } if (count==1&&ip == start_ip) result = true;//如果指定的IP範圍就是一個IP,那麼直接匹配看是否相等
else if (count == 2)//如果指定IP範圍 是一個起始IP範圍區間
{ byte[] start_ip_array = Get4Byte(start_ip);//將點分十進位 轉換成 4個元素的位元組數組
byte[] end_ip_array = Get4Byte(end_ip); byte[] ip_array = Get4Byte(ip); bool tmpRes = true; for (int i = 0; i < 4; i++) {            //從左至右 依次比較 對應位置的 值的大小 ,一旦檢測到不在對應的範圍 那麼說明IP不在指定的範圍內 並將終止迴圈
if (ip_array[i] > end_ip_array[i] || ip_array[i] < start_ip_array[i]) { tmpRes = false; break; } } result = tmpRes; } return result; }//嘗試解析IP範圍 並擷取閉區間的 起始IP (包含)
private static void TryParseRanges(string ranges, out int count, out string start_ip, out string end_ip) { string[] _r = ranges.Split('-'); if (!(_r.Count() == 2 || _r.Count() == 1)) throw new ApplicationException("IP範圍指定格式不正確,可以指定一個IP,如果是一個範圍請用“-”分隔"); count = _r.Count(); start_ip = _r[0]; end_ip = ""; try { IPAddress.Parse(_r[0]); } catch (Exception) { throw new ApplicationException("IP地址無效"); } if (_r.Count() == 2) { end_ip = _r[1]; try { IPAddress.Parse(_r[1]); } catch (Exception) { throw new ApplicationException("IP地址無效"); } } } /// <summary> /// 將IP四組值 轉換成byte型 /// </summary> /// <param name="ip"></param> /// <returns></returns> static byte[] Get4Byte(string ip) { string[] _i = ip.Split('.'); List<byte> res = new List<byte>(); foreach (var item in _i) { res.Add(Convert.ToByte(item)); } return res.ToArray(); }

未來得及測試,有不足之處或者有更好的方法請踴躍交流

 

 

剛發布,網友就告訴我一個更簡單的方法就是 把IP轉換成Long型

IPAddress i=IPAddress.Parse("255.255.255.255");long l = i.Address;Console.WriteLine(l);Console.WriteLine(long.MaxValue);

 

但是隨後 經過測試 發現轉換成long類型的方法 還是有問題  :

比如:192.168.0.0~192.168.255.255和10.0.0.0~10.255.255.255是允許的IP端

如果192.165.0.0本來不在前面這個範圍 也不在 後面那個範圍

但是用long的方法  就會檢測出道後面這個範圍內。

用我上面的方法就可以準確檢測

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.