58

我有一种方法来验证参数 IP 地址。作为一个整体的开发新手,我想知道是否有更好的方法来做到这一点。

/// <summary>
/// Check IP Address, will accept 0.0.0.0 as a valid IP
/// </summary>
/// <param name="strIP"></param>
/// <returns></returns>
public bool CheckIPValid(string strIP)
{
    //  Split string by ".", check that array length is 3
    char chrFullStop = '.';
    string[] arrOctets = strIP.Split(chrFullStop);
    if (arrOctets.Length != 4)
    {
        return false;
    }
    //  Check each substring checking that the int value is less than 255 and that is char[] length is !> 2
    Int16 MAXVALUE = 255;
    Int32 temp; // Parse returns Int32
    foreach (string strOctet in arrOctets)
    {
        if (strOctet.Length > 3)
        {
            return false;
        }

        temp = int.Parse(strOctet);
        if (temp > MAXVALUE)
        {
            return false;
        }
    }
    return true;
}

它很简单(我可以做到),但它似乎可以解决问题。

4

11 回答 11

118

方法的限制IPAddress.TryParse它验证一个字符串是否可以转换为 IP 地址,因此如果它提供了一个类似的字符串值"5",它认为它是"0.0.0.5"

验证 IPv4 的另一种方法如下:

public bool ValidateIPv4(string ipString)
{
    if (String.IsNullOrWhiteSpace(ipString))
    {
        return false;
    }

    string[] splitValues = ipString.Split('.');
    if (splitValues.Length != 4)
    {
        return false;
    }

    byte tempForParsing;

    return splitValues.All(r => byte.TryParse(r, out tempForParsing));
}

它可以像这样测试:

List<string> ipAddresses = new List<string>
{
    "2",
    "1.2.3",
    "1.2.3.4",
    "255.256.267.300",
    "127.0.0.1",
};
foreach (var ip in ipAddresses)
{
    Console.WriteLine($"{ip} ==> {ValidateIPv4(ip)}");
}

输出将是:

2 ==> False
1.2.3 ==> False
1.2.3.4 ==> True
255.256.267.300 ==> False
127.0.0.1 ==> True

您也可以使用IPAddress.TryParse,但它有局限性,可能导致解析不正确。

System.Net.IPAddress.TryParse 方法

请注意,如果 TryParse 成功解析输入,则返回 true,但这并不一定意味着生成的 IP 地址是有效的。请勿使用此方法验证 IP 地址。

但这适用于包含至少三个点的普通字符串。就像是:

string addrString = "192.168.0.1";
IPAddress address;
if (IPAddress.TryParse(addrString, out address)) {
       //Valid IP, with address containing the IP
} else {
       //Invalid IP
}

您可以检查是否存在三个点,IPAddress.TryParse然后调用TryParse

public static bool ValidateIPv4(string ipString)
{
    if (ipString.Count(c => c == '.') != 3) return false;
    IPAddress address;
    return IPAddress.TryParse(ipString, out address);
}
于 2012-07-10T12:08:29.680 回答
14
using System.Net;
public static bool CheckIPValid(string strIP)
{
    IPAddress result = null;
    return
        !String.IsNullOrEmpty(strIP) &&
        IPAddress.TryParse(strIP, out result);
}

你完成了

编辑 1

添加了一些额外的检查以防止抛出异常(代价高昂)。PS它不会处理unicode。

编辑 2

@StephenMurby如果成功解析字符串,IPAddress.TryParse将返回true 。如果您检查该方法的文档,尽管它会在两种情况下引发异常。

  1. 字符串为空。
  2. 该字符串包含 unicode 字符。

由您决定(设计决定)是要抛出异常还是返回 false。在解析方面,我通常更喜欢返回 false 而不是异常(假设这是不保证正确的输入)。

打破退货声明,我是说,

  1. 字符串不为空(也不为空,无论如何都不会解析)并且
  2. IP 地址解析正确。

请记住,C# 布尔表达式是惰性求值的,因此 CLR 甚至不会尝试解析字符串null或空字符串。

关于缺少的如果,你可以做类似的事情,

if (IP.TryParse(strIP, out result)
{
    return true;
}

但是你真正做的只是说如果某件事是真的,就返回真的。更容易直接返回表达式。

于 2012-07-10T12:09:12.113 回答
13

最好的正则表达式解决方案(对 MVC DataAnnotations 有用):

^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$

C#

Regex.IsMatch(value, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$")
于 2017-09-06T16:08:00.840 回答
6

不使用 IPAddress 类并针对字节进行验证,这比 Int<256 方法要好得多。

    public Boolean CheckIPValid(String strIP)
    {
        //  Split string by ".", check that array length is 4
        string[] arrOctets = strIP.Split('.');
        if (arrOctets.Length != 4)
            return false;

        //Check each substring checking that parses to byte
        byte obyte = 0;
        foreach (string strOctet in arrOctets)
            if (!byte.TryParse(strOctet, out obyte)) 
                return false;

        return true;
    }
于 2015-04-29T11:52:38.950 回答
2

该框架提供了IPAddress类,而类又为您提供了ParseTryParse方法。

// myAddress is a System.Net.IPAddress instance
if (System.Net.IPAddress.TryParse(strIP , out myAddress)) 
    // IP is valid
else
    // IP isn't valid
于 2012-07-10T12:09:51.147 回答
2

很惊讶没有人提供正则表达式解决方案。您只需要包含 System.Text.RegularExpressions。为了在实际代码和本示例中的可读性,我总是将我的正则表达式模式分块成一个字符串数组,然后加入它。

        // Any IP Address
        var Value = "192.168.0.55"; 
        var Pattern = new string[]
        {
            "^",                                            // Start of string
            @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.",    // Between 000 and 255 and "."
            @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.",
            @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.",
            @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])",      // Same as before, no period
            "$",                                            // End of string
        };

        // Evaluates to true 
        var Match = Regex.IsMatch(Value, string.Join(string.Empty, Pattern));
于 2017-05-05T15:02:14.697 回答
2

您可以这样处理它是 ipv4 或 ipv6:

    public static string CheckIPValid(string strIP)
    {
        //IPAddress result = null;
        //return !String.IsNullOrEmpty(strIP) && IPAddress.TryParse(strIP, out result);
        IPAddress address;
        if (IPAddress.TryParse(strIP, out address))
        {
            switch (address.AddressFamily)
            {
                case System.Net.Sockets.AddressFamily.InterNetwork:
                    // we have IPv4
                    return "ipv4";
                //break;
                case System.Net.Sockets.AddressFamily.InterNetworkV6:
                    // we have IPv6
                    return "ipv6";
                //break;
                default:
                    // umm... yeah... I'm going to need to take your red packet and...
                    return null;
                    //break;
            }
        }
        return null;
    }
于 2019-01-01T09:53:09.240 回答
0

要验证 IP 地址,请使用以下软件包

套餐:-

using System.Net;  //To use IPAddress, inbuilt functionality
using System.Net.Sockets; //To access AddressFamily,
using System.Text.RegularExpression; //For Regex.IsMatch()

方法:-

public bool ValidIPAddress(string IP)
{
    //Validate IP Address , neither IPV4, or V6

    if (IPAddress.TryParse(IP, out var address) == false)
       return false;
    //check for IPV6

    if (address.AddressFamily == AddressFamily.InterNetworkV6)

    {

        if (IP.IndexOf("::") > -1)

            return true;

        return false;

    }

    //check for IPV4

    else

    {

    //Ipv4 address shouldn't start with 0 eg..it is invalid 0XX.0XX.0XX.0XX
        if (Regex.IsMatch(IP, @"(^0\d|\.0\d)"))

            return false;

        else if (IP.Count(c => c == '.') != 3)

            return false;

        else

            return true;

    }

}

如果需要,请查看以下链接:-

https://lncharan.blogspot.com/2020/09/validate-ip-address-in-c.html

于 2020-09-01T15:23:38.000 回答
0

如果您只想检查是否有效,请仅执行以下操作:

bool isValid = IPAddress.TryParse(stringIP, out IPAddress _);

即使高于 255 并且如果有点,它也将有效,因此无需检查它。

于 2017-10-23T06:29:57.517 回答
0

有一个简单的方法可以做到这一点,但它需要互联网连接来检查 IP 或主机名:

using System;
using System.Net;

var dnsAddress = ///

try
{
    // IP like 8.8.8.8
    if (IPAddress.TryParse(dnsAddress, out var ipAddress)
        && Dns.GetHostAddresses(ipAddress.ToString()).Length >= 1)
    {
        return true;
    }

    // Hostname like smtp.gmail.com
    if (Dns.GetHostEntry(dnsAddress).AddressList.Length >= 1)
    {
        return true;
    }

    return false;
}
catch (Exception exception) when (
            exception is ArgumentNullException
            || exception is ArgumentOutOfRangeException
            || exception is System.Net.Sockets.SocketException
            || exception is ArgumentException
)
{
    // Write log message, if necessary

    return false;
}
于 2021-01-07T17:49:58.897 回答
0

试试这个:

private bool IsValidIP(String ip)
    {
        try
        {
            if (ip == null || ip.Length == 0)
            {
                return false;
            }

            String[] parts = ip.Split(new[] { "." }, StringSplitOptions.None);
            if (parts.Length != 4)
            {
                return false;
            }

            foreach (String s in parts)
            {
                int i = Int32.Parse(s);
                if ((i < 0) || (i > 255))
                {
                    return false;
                }
            }
            if (ip.EndsWith("."))
            {
                return false;
            }

            return true;
        }
        catch (Exception e)
        {
            return false;
        }
    }
于 2017-01-16T13:13:43.293 回答