我知道正则表达式dangerous用于验证IP地址,因为IP地址可以采用不同的格式。
我见过类似的C和C ++问题,而这些问题是用C#inet_ntop()
中不存在的函数解决的我发现的.NET解决方案只处理标准的“ddd.ddd.ddd.ddd”表单。有什么建议吗?
答案 0 :(得分:130)
您可以使用它来尝试解析它:
IPAddress.TryParse
然后检查AddressFamily
返回IPv4的System.Net.Sockets.AddressFamily.InterNetwork或IPv6的System.Net.Sockets.AddressFamily.InterNetworkV6。
编辑:一些示例代码。根据需要改变:
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;
}
}
答案 1 :(得分:28)
关于使用System.Net.IpAddress.TryParse()
:
如果传递一个包含整数(例如“3”)的字符串,TryParse函数会将其转换为“0.0.0.3”,因此将其转换为有效的InterNetworkV4地址。因此,至少应该将重新格式化的“0.0.0.3”返回给用户应用程序,以便用户知道他们的输入是如何被解释的。
答案 2 :(得分:14)
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。 IPv4为AddressFamily.InterNetwork
,IPv6为AddressFamily.InterNetworkV6
。
答案 3 :(得分:7)
您可以查看返回System.Uri.CheckHostName( value )的Unknown
, Dns
, IPv4
, IPv6
。
if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
//then 'value' is a valid IP address or hostname
答案 4 :(得分:3)
如果您不想解析每个整数,但只想解析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;
}
}
}
答案 5 :(得分:0)
您可以使用IPAddress.GetAddressBytes()。Length属性
IPAddress someIP;
if (someIP.GetAddressBytes().Length == 4)
{
// IPV4
}
else (someIP.GetAddressBytes().Length == 16)
{
// IPV6
}
else
{
// Unknown
}
我想应该工作
答案 6 :(得分:0)
应用于字符串或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;
}