如何确定一个string在C#中是一个有效的IPv4或IPv6地址?
我知道正则expression式对validationIP地址是很危险的 ,因为IP地址可以采用不同的格式。
我已经看到了C和C ++的类似问题,并且用C# inet_ntop()中不存在的函数解决了这些问题。
我find的.NET解决scheme只处理标准的“ddd.ddd.ddd.ddd”forms。 有什么build议么?
你可以使用它来尝试parsing它:
IPAddress.TryParse
然后检查AddressFamily
哪个
返回System.Net.Sockets.AddressFamily.InterNetwork for IPv4或System.Net.Sockets.AddressFamily.InterNetworkV6 for IPv6。
编辑:一些示例代码。 根据需要更改:
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; } }
只是关于使用System.Net.IpAddress.TryParse()
的警告:
如果你传递一个包含一个整数的string(例如“3”),TryParse函数将把它转换为“0.0.0.3”,因此是一个有效的InterNetworkV4地址。 所以,至less应该将重新格式化的“0.0.0.3”返回给用户应用程序,以便用户知道他们的input是如何解释的。
string myIpString = "192.168.2.1"; System.Net.IPAddress ipAddress = null; bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
如果isValidIp
为true,则可以检查ipAddress.AddressFamily
以确定它是IPv4还是IPv6。 它是AddressFamily.InterNetwork
为IPv4和AddressFamily.InterNetworkV6
为IPv6。
你可以查看返回Unknown
, Dns
, IPv4
, IPv6
System.Uri.CheckHostName(value) 。
if( Uri.CheckHostName( value ) != UriHostNameType.Unknown) //then 'value' is a valid IP address or hostname
如果你不想分析每一个整数,但只有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; } } }
您可以使用IPAddress.GetAddressBytes()。Length属性
IPAddress someIP; if (someIP.GetAddressBytes().Length == 4) { // IPV4 } else (someIP.GetAddressBytes().Length == 16) { // IPV6 } else { // Unknown }
我想应该工作
适用于string或IPAddress的testing组合,适用于我。
/// <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; }