可能重复:
如何检查输入IP是否属于特定IP范围

我想检查一下IP地址是否在私有IP地址范围内。 我在.NET中找不到任何方法,我不确定如何自己构建它?

例如CheckIsIpPublic("192.168.0.1", upperIp, lowerIp) //should return false

例如CheckIsIpPublic("78.60.143.29", upperIp, lowerIp) //should return true

var upperIp = new List<IPAddress>
             {
               IPAddress.Parse("192.168.0.0"),
               IPAddress.Parse("10.0.0.0"),
               IPAddress.Parse("172.16.0.0"),
               IPAddress.Parse("224.0.0.0")
             };

var lowerIp = new List<IPAddress>
             {
               IPAddress.Parse("192.168.255.255"), 
               IPAddress.Parse("10.255.255.255"), 
               IPAddress.Parse("172.31.255.255"), 
               IPAddress.Parse("255.255.255.255")
             };

#1楼 票数:7 已采纳

使用Codeplex中IPNetwork类 ,您可以执行以下操作:

//see http://en.wikipedia.org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses
ReadOnlyCollection<IPNetwork> reservedNetworks =
    new ReadOnlyCollection<IPNetwork>(new[]
        {
            IPNetwork.Parse("0.0.0.0/8"),
            IPNetwork.Parse("10.0.0.0/8"),
            IPNetwork.Parse("127.0.0.0/8"),
            IPNetwork.Parse("169.254.0.0/16"),
            IPNetwork.Parse("172.16.0.0/12"),
            IPNetwork.Parse("192.0.2.0/24"),
            IPNetwork.Parse("192.88.99.0/24"),
            IPNetwork.Parse("192.168.0.0/16"),
            IPNetwork.Parse("198.18.0.0/15"),
            IPNetwork.Parse("198.51.100.0/24"),
            IPNetwork.Parse("203.0.113.0/24"),
            IPNetwork.Parse("224.0.0.0/4"),
            IPNetwork.Parse("240.0.0.0/4")
        });

var isInRange = 
  !reservedNetworks.Any(n => IPNetwork.Contains(n, suspiciousIpAddress));

#2楼 票数:1

public struct IpRange
{
    public IPAddress LowerIP;
    public IPAddress UpperIP;

    public IpRange(IPAddress lowerIP, IPAddress upperIP)
    {
        LowerIP = lowerIP;
        UpperIP = upperIP;
    }
}
    public bool CheckIsIpPublic(string adress, List<IpRange> rangeList)
    {
        foreach (var range in rangeList)
        {
            List<int> adressInt = adress.Split('.').Select(str => int.Parse(str)).ToList();
            List<int> lowerInt = range.LowerIP.ToString().Split('.').Select(str => int.Parse(str)).ToList();
            List<int> upperInt = range.UpperIP.ToString().Split('.').Select(str => int.Parse(str)).ToList();

            if (adressInt[0] >= lowerInt[0] && adressInt[0] < upperInt[0])
            {
                return true;
            }
            else if (adressInt[0] >= lowerInt[0] && adressInt[0] == upperInt[0])
            {
                if (adressInt[1] >= lowerInt[1] && adressInt[1] < upperInt[1])
                {
                    return true;
                }
                else if (adressInt[1] >= lowerInt[1] && adressInt[1] == upperInt[1])
                {
                    if (adressInt[2] >= lowerInt[2] && adressInt[2] < upperInt[2])
                    {
                        return true;
                    }
                    else if (adressInt[2] >= lowerInt[2] && adressInt[2] == upperInt[2])
                    {
                        if (adressInt[3] >= lowerInt[3] && adressInt[3] <= upperInt[3])
                        {
                            return true;
                        }
                    }

                }

            }
        }
        return false;
    }

并运行这件事你应该使用

var rangeList = new List<IpRange>();
rangeList.Add(new IpRange(IPAddress.Parse("192.168.0.0"),IPAddress.Parse("192.168.255.255")));
rangeList.Add(new IpRange(IPAddress.Parse("10.0.0.0"),IPAddress.Parse("10.255.255.255")));
rangeList.Add(new IpRange(IPAddress.Parse("172.16.0.0"),IPAddress.Parse("172.31.255.255")));
rangeList.Add(new IpRange(IPAddress.Parse("224.0.0.0"),IPAddress.Parse("255.255.255.255")));
bool result = CheckIsIpPublic("78.60.143.29", rangeList);

#3楼 票数:0

像下面这样的东西可以工作(不编译):

public bool IsPrivateIp(string ipAddress)
{
    return (ipAddress.StartsWith("192.168") || ipaddress.Equals("127.0.0.1") || ipAddress.StartsWith("10.0")) ;
}

如果为内部IP地址(10.0.0.0 - 10.0.255.255)留出整个范围,则效果最佳。

  ask by Tomas translate from so

未解决问题?本站智能推荐:

2回复

比较Ip值以确定是否在特定范围内

是否有任何方法可以将ip地址与特定范围内的地址进行比较。 ips变量存储ip值。 我想比较10.100.12.21和10.255.15.30。 如何比较其他类型的ips? 在比较该IP范围之后,转换为ips值以加倍。 还是其他想法?
1回复

如何使用C#检查IP地址是否可访问

我正在验证给定的IP是否可用。 在服务器PING,TELNET等选项中被禁用。 我尝试使用套接字连接,但这需要允许给定的端口。 有没有可靠的解决方案来检查这一点。 它应该在所有环境下运行[独立于操作系统] 请指导我在C#上实现此功能
1回复

ip地址GetHostName空检查

我想使用C#从特定IP范围获取域名 但是我遇到此错误所请求的名称有效,并且已在数据库中找到,但没有解析为的正确关联数据 有些Ip没有域名。但是我不能对GetHostEntry进行空检查。 我尝试那样,但没有任何变化。 如何进行null检查以绕过此错误?
1回复

如何获得连接的IP地址? [重复]

这个问题已经在这里有了答案: 获取公共/外部IP地址? 24个答案 我想知道连接的IP地址。 不是本地IP。 本地IP:192.168。#。#WAN IP:#。#。#。# 您可以在http://whatismyip.org上看到您的WAN IP 。
2回复

是否有内置方法来检查IP地址是否已被占用?

我的软件更改了计算机的IP,但我与其他设备发生冲突。 在设置之前是否有内置方法检查IP地址是否已被占用/占用? 谢谢
8回复

给定IP地址和网络掩码时如何计算IP范围?

当 IP 范围写为 aaa.bbb.ccc.ddd/netmask ( CIDR Notation ) 时,我需要使用 C# 计算此范围内包含的第一个和最后一个 IP 地址。 例子: 输入: 192.168.0.1/25 结果: 192.168.0.1 - 192.168.0.126
4回复

检查IP地址的前X位

我的目标是在用户的本地IP不是以10.80开头的情况下执行代码。 我找不到不容易出错的方法,例如: 这是我要获取IP的条件: 然后,我尝试将其转换为int以检查它是否为<或>: 但是问题是,如果有一个2位数的IP值(例如10.80.22.23 ,它将无法正
1回复

将IP范围转换为CIDR地址范围c#

我有以下问题:我需要在不CIDR地址的情况下将IP地址范围转换为CIDR地址范围。 例如,如果我的范围是1.1.1.3 - 1.1.1.7 ,我可以将其转换为 使用IPNetwork库,但如果我将1.1.1.1/29再次转换为范围,则得到1.1.1.1 - 1.1.1.6 。 我如何