如何确定字符串是 C# 中有效的 IPv4 还是 IPv6 地址?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/799060/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to determine if a string is a valid IPv4 or IPv6 address in C#?
提问by Josh
I know regex is dangerousfor validating IP addresses because of the different forms an IP address can take.
我知道正则表达式对于验证 IP 地址很危险,因为 IP 地址可以采用不同的形式。
I've seen similar questions for C and C++, and those were resolved with a function that doesn't exist in C# inet_ntop()
我已经看到 C 和 C++ 的类似问题,这些问题是用 C# inet_ntop()中不存在的函数解决的
The .NET solutions I've found only handle the standard "ddd.ddd.ddd.ddd" form. Any suggestions?
我发现的 .NET 解决方案只处理标准的“ddd.ddd.ddd.ddd”形式。有什么建议?
采纳答案by Erich Mirabal
You can use this to try and parse it:
您可以使用它来尝试解析它:
IPAddress.TryParse
Then check AddressFamily
which
然后检查AddressFamily
哪个
Returns System.Net.Sockets.AddressFamily.InterNetwork for IPv4 or System.Net.Sockets.AddressFamily.InterNetworkV6 for IPv6.
返回 System.Net.Sockets.AddressFamily.InterNetwork for IPv4 或 System.Net.Sockets.AddressFamily.InterNetworkV6 for IPv6。
EDIT: some sample code. change as desired:
编辑:一些示例代码。根据需要更改:
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;
}
}
回答by Tamas Czinege
string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;
bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
If isValidIp
is true, you can check ipAddress.AddressFamily
to determine if it's IPv4 or IPv6. It's AddressFamily.InterNetwork
for IPv4 and AddressFamily.InterNetworkV6
for IPv6.
如果isValidIp
为真,您可以检查ipAddress.AddressFamily
以确定它是 IPv4 还是 IPv6。它AddressFamily.InterNetwork
适用于 IPv4 和AddressFamily.InterNetworkV6
IPv6。
回答by Aaronster
Just a warning about using System.Net.IpAddress.TryParse()
:
只是关于使用的警告System.Net.IpAddress.TryParse()
:
If you pass it an string containing an integer (e.g. "3") the TryParse function will convert it to "0.0.0.3" and, therefore, a valid InterNetworkV4 address. So, at the very least, the reformatted "0.0.0.3" should be returned to the user application so the user knows how their input was interpreted.
如果您向它传递一个包含整数(例如“3”)的字符串,TryParse 函数会将其转换为“0.0.0.3”,因此是一个有效的 InterNetworkV4 地址。因此,至少,重新格式化的“0.0.0.3”应该返回给用户应用程序,以便用户知道他们的输入是如何被解释的。
回答by Daniel
You could check out System.Uri.CheckHostName( value )that returns Unknown
, Dns
, IPv4
, IPv6
.
您可以查看返回, , , 的System.Uri.CheckHostName( value )。 Unknown
Dns
IPv4
IPv6
if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
//then 'value' is a valid IP address or hostname
回答by Mc_Topaz
You may use the IPAddress.GetAddressBytes().Length property
您可以使用 IPAddress.GetAddressBytes().Length 属性
IPAddress someIP;
if (someIP.GetAddressBytes().Length == 4)
{
// IPV4
}
else (someIP.GetAddressBytes().Length == 16)
{
// IPV6
}
else
{
// Unknown
}
I guess should work
我想应该工作
回答by King_SaGo
If you don't want to parse every integer, but only IPs, just check .
for IPv4 and :
for IPv6.
如果您不想解析每个整数,而只想解析 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;
}
}
}
回答by JGU
A combination of tests applied to a string or IPAddress, works for me..
应用于字符串或 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;
}