代码之家  ›  专栏  ›  技术社区  ›  Josh

如何确定字符串在C#中是否为有效的IPv4或IPv6地址?

  •  62
  • Josh  · 技术社区  · 15 年前

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

    inet_ntop()

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

    7 回复  |  直到 15 年前
        1
  •  159
  •   Erich Mirabal    15 年前

     IPAddress.TryParse
    

    然后检查 AddressFamily

        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;
            }
        }
    
        2
  •  34
  •   Aaronster    13 年前

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

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

        3
  •  19
  •   Tamas Czinege    15 年前
    string myIpString = "192.168.2.1";
    System.Net.IPAddress ipAddress = null;
    
    bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
    

    如果 isValidIp ipAddress.AddressFamily 以确定它是IPv4还是IPv6。它是 AddressFamily.InterNetwork 对于IPv4和 AddressFamily.InterNetworkV6 对于IPv6。

        4
  •  7
  •   Daniel    12 年前

    你可以退房 System.Uri.CheckHostName( value ) Unknown , Dns , IPv4 , IPv6 .

    if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
        //then 'value' is a valid IP address or hostname
    
        5
  •  4
  •   King_SaGo    10 年前

    . : 对于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;
                    }
                }
            }
    
        6
  •  1
  •   Mc_Topaz    11 年前

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

    我想应该有用

        7
  •  1
  •   JGU    9 年前

    应用于字符串或IP地址的测试组合对我很有用。。

            /// <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;
        }