如何确定一个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。

你可以查看返回UnknownDnsIPv4IPv6 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; }