如何确定字符串是 C# 中有效的 IPv4 还是 IPv6 地址?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/799060/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 01:38:56  来源:igfitidea点击:

How to determine if a string is a valid IPv4 or IPv6 address in C#?

c#.netip-address

提问by Josh

I know regex is dangerousfor validating IP addresses because of the different forms an IP address can take.

我知道正则表达式对于验证 IP 地址很危险,因为 IP 地址可以采用不同的形式。

I've seen similar questions for C and C++, and those were resolved with a function that doesn't exist in C# inet_ntop()

我已经看到 C 和 C++ 的类似问题,这些问题是用 C# inet_ntop()中不存在的函数解决的

The .NET solutions I've found only handle the standard "ddd.ddd.ddd.ddd" form. Any suggestions?

我发现的 .NET 解决方案只处理标准的“ddd.ddd.ddd.ddd”形式。有什么建议?

采纳答案by Erich Mirabal

You can use this to try and parse it:

您可以使用它来尝试解析它:

 IPAddress.TryParse

Then check AddressFamilywhich

然后检查AddressFamily哪个

Returns System.Net.Sockets.AddressFamily.InterNetwork for IPv4 or System.Net.Sockets.AddressFamily.InterNetworkV6 for IPv6.

返回 System.Net.Sockets.AddressFamily.InterNetwork for IPv4 或 System.Net.Sockets.AddressFamily.InterNetworkV6 for IPv6。

EDIT: some sample code. change as desired:

编辑:一些示例代码。根据需要更改:

    string input = "your IP address goes here";

    IPAddress address;
    if (IPAddress.TryParse(input, out address))
    {
        switch (address.AddressFamily)
        {
            case System.Net.Sockets.AddressFamily.InterNetwork:
                // we have IPv4
                break;
            case System.Net.Sockets.AddressFamily.InterNetworkV6:
                // we have IPv6
                break;
            default:
                // umm... yeah... I'm going to need to take your red packet and...
                break;
        }
    }

回答by Tamas Czinege

string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;

bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);

If isValidIpis true, you can check ipAddress.AddressFamilyto determine if it's IPv4 or IPv6. It's AddressFamily.InterNetworkfor IPv4 and AddressFamily.InterNetworkV6for IPv6.

如果isValidIp为真,您可以检查ipAddress.AddressFamily以确定它是 IPv4 还是 IPv6。它AddressFamily.InterNetwork适用于 IPv4 和AddressFamily.InterNetworkV6IPv6。

回答by Aaronster

Just a warning about using System.Net.IpAddress.TryParse():

只是关于使用的警告System.Net.IpAddress.TryParse()

If you pass it an string containing an integer (e.g. "3") the TryParse function will convert it to "0.0.0.3" and, therefore, a valid InterNetworkV4 address. So, at the very least, the reformatted "0.0.0.3" should be returned to the user application so the user knows how their input was interpreted.

如果您向它传递一个包含整数(例如“3”)的字符串,TryParse 函数会将其转换为“0.0.0.3”,因此是一个有效的 InterNetworkV4 地址。因此,至少,重新格式化的“0.0.0.3”应该返回给用户应用程序,以便用户知道他们的输入是如何被解释的。

回答by Daniel

You could check out System.Uri.CheckHostName( value )that returns Unknown, Dns, IPv4, IPv6.

您可以查看返回, , , 的System.Uri.CheckHostName( value )UnknownDnsIPv4IPv6

if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
    //then 'value' is a valid IP address or hostname

回答by Mc_Topaz

You may use the IPAddress.GetAddressBytes().Length property

您可以使用 IPAddress.GetAddressBytes().Length 属性

        IPAddress someIP;

        if (someIP.GetAddressBytes().Length == 4)
        {
            // IPV4
        }
        else (someIP.GetAddressBytes().Length == 16)
        {
            // IPV6
        }
        else
        {
            // Unknown
        }

I guess should work

我想应该工作

回答by King_SaGo

If you don't want to parse every integer, but only IPs, just check .for IPv4 and :for IPv6.

如果您不想解析每个整数,而只想解析 IP,只需检查 .IPv4 和:IPv6。

        if (input.Contains(".") || input.Contains(":"))
        {
            IPAddress address;
            if (IPAddress.TryParse(input, out address))
            {
                switch (address.AddressFamily)
                {
                    case AddressFamily.InterNetwork:
                        return Ip4Address;
                    case AddressFamily.InterNetworkV6:
                        return Ip6Address;
                }
            }
        }

回答by JGU

A combination of tests applied to a string or IPAddress, works for me..

应用于字符串或 IPAddress 的测试组合对我有用..

        /// <summary>
    /// Test string for valid ip address format
    /// </summary>
    /// 
    /// <param name="Address">The ip address string</param>
    /// 
    /// <returns>Returns true if address is a valid format</returns>
    public static bool IsValidIP(IPAddress Ip)
    {
        byte[] addBytes = Ip.GetAddressBytes();

        switch (Ip.AddressFamily)
        {
            case AddressFamily.InterNetwork:
                if (addBytes.Length == 4)
                    return true;
                break;
            case AddressFamily.InterNetworkV6:
                if (addBytes.Length == 16)
                    return true;
                break;
            default:
                break;
        }

        return false;
    }

    /// <summary>
    /// Test string for valid ip address format
    /// </summary>
    /// 
    /// <param name="Address">The ip address string</param>
    /// 
    /// <returns>Returns true if address is a valid format</returns>
    public static bool IsValidIP(string Address)
    {
        IPAddress ip;
        if (IPAddress.TryParse(Address, out ip))
        {
            switch (ip.AddressFamily)
            {
                case System.Net.Sockets.AddressFamily.InterNetwork:
                    if (Address.Length > 6 && Address.Contains("."))
                    {
                        string[] s = Address.Split('.');
                        if (s.Length == 4 && s[0].Length > 0 &&  s[1].Length > 0 &&  s[2].Length > 0 &&  s[3].Length > 0)
                            return true;
                    }
                    break;
                case System.Net.Sockets.AddressFamily.InterNetworkV6:
                    if (Address.Contains(":") && Address.Length > 15)
                        return true;
                    break;
                default:
                    break;
            }
        }

        return false;
    }