找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 上位机编程 查看内容

如何通过 C# 判断某个 IP 是否属于某IP段?

2021-12-5 22:03| 发布者: gk-auto| 查看: 1115| 评论: 0

摘要: 来源:StackoverflowNET技术问答https://mp.weixin.qq.com/s/A6oJUeWEvqDmFToMG69p-Q咨询区Ricky:如果判断某一个IP (172.16.11.50) 是否落在某一个 IP 段内?比如这样的段:172.16.11.5 - 100,另外不知道 C# 中是 ...

来源:Stackoverflow NET技术问答

https://mp.weixin.qq.com/s/A6oJUeWEvqDmFToMG69p-Q

咨询区

  • Ricky

如果判断某一个IP (172.16.11.50) 是否落在某一个 IP 段内?比如这样的段:172.16.11.5 - 100,另外不知道 C# 中是否有现成的轮子可以做这件事 ?

回答区

  • BuddhiP

可以考虑使用 @jsakamoto 大佬写的工具包,这个工具包允许下面三种格式的 IP段。

  1. 192.168.0.0/24

  2. 192.168.0.0/255.255.255.0

  3. 192.168.0.0-192.168.0.255

然后使用 Contains 方法判断指定的 IP 是否在其中,这个工具包支持 IP4 和 IP6, github地址:https://github.com/jsakamoto/ipaddressrange

参考如下代码:


using NetTools;
...
// rangeA.Begin is "192.168.0.0", and rangeA.End is "192.168.0.255".
var rangeA = IPAddressRange.Parse("192.168.0.0/255.255.255.0");
rangeA.Contains(IPAddress.Parse("192.168.0.34")); // is True.
rangeA.Contains(IPAddress.Parse("192.168.10.1")); // is False.
rangeA.ToCidrString(); // is 192.168.0.0/24

// rangeB.Begin is "192.168.0.10", and rangeB.End is "192.168.10.20".
var rangeB1 = IPAddressRange.Parse("192.168.0.10 - 192.168.10.20");
rangeB1.Contains(IPAddress.Parse("192.168.3.45")); // is True.
rangeB1.Contains(IPAddress.Parse("192.168.0.9")); // is False.

// Support shortcut range description. 
// ("192.168.10.10-20" means range of begin:192.168.10.10 to end:192.168.10.20.)
var rangeB2 = IPAddressRange.Parse("192.168.10.10-20");

// Support CIDR expression and IPv6.
var rangeC = IPAddressRange.Parse("fe80::/10"); 
rangeC.Contains(IPAddress.Parse("fe80::d503:4ee:3882:c586%3")); // is True.
rangeC.Contains(IPAddress.Parse("::1")); // is False.

  • maxshuty

最好的办法就是将 Address 转成 Integer,然后再比较 int 的范围,至于怎么将 IP 转成 Integer,参考链接:http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp

通过这个类,可以将 IP 转成 4 个 byte 字节,比如你提供的 ip地址就可以转成如下。


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

接下来计算 . 中的 decimal 值,再套用下面的公式。


    (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

  • Minoo Moradi

我有一个小技巧,可以先算出开始IP 和 结束IP,然后将里面的 . 字符全部抹掉后转成一个 long 值,再比较指定的 long 值是否在指定的 start - end 区间内, 参考如下代码:


var givenIp = Convert.ToInt64(clientIp.Replace("."""));
var startIp = Convert.ToInt64(startRange.Replace("."""));
var endIp = Convert.ToInt64(endRange.Replace("."""));

if (givenIp != startIp && givenIp != endIp && (givenIp < startIp || givenIp > endIp))
{
   Console.WriteLine("your ip does not allow to access!");
}

点评区

三位大佬总结的特别好,而且还发现了一个现成的轮子,nuget地址:https://www.nuget.org/packages/IPAddressRange  ,大家可以下载试用。

关注公众号,加入500人微信群,下载100G免费资料!
发表评论

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 02:02 , Processed in 0.061880 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部