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

前端 未结 7 1291
逝去的感伤
逝去的感伤 2020-12-23 18:48

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

I\'ve seen similar questions for C and C++, and those we

7条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-23 19:24

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

            /// 
        /// Test string for valid ip address format
        /// 
        /// 
        /// The ip address string
        /// 
        /// Returns true if address is a valid format
        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;
        }
    
        /// 
        /// Test string for valid ip address format
        /// 
        /// 
        /// The ip address string
        /// 
        /// Returns true if address is a valid format
        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;
        }
    

提交回复
热议问题