Как определить, является ли строка допустимым IPv4 или IPv6-адресом в C#?
Я знаю, что regex опасно для проверки IP-адресов из-за различных форм, которые может принимать IP-адрес.
Я видел подобные вопросы для C и C++, и они были решены с помощью функции, которая не существует в C# inet_ntop ()
решения .NET, которые я нашел, обрабатывают только стандартный " ddd.ddd.ddd.ДДД" форма. Есть предложения?
7 ответов
вы можете использовать это, чтобы попытаться разобрать его:
IPAddress.TryParse
затем проверить AddressFamily
, который
Система Возвращается.Чистая.Розетки.AddressFamily.Сети для IPv4 или системы.Чистая.Розетки.AddressFamily.InterNetworkV6 для IPv6.
EDIT: некоторый пример кода. изменить по желанию:
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()
:
Если вы передадите ему строку, содержащую целое число (например, "3"), функция TryParse преобразует ее в "0.0.0.3" и, следовательно, действительный адрес InterNetworkV4. Таким образом, по крайней мере, переформатированный "0.0.0.3" должен быть возвращен пользовательскому приложению, чтобы пользователь знал, как интерпретировался их ввод.
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. Это AddressFamily.InterNetwork
для IPv4 и AddressFamily.InterNetworkV6
для IPv6.
Если вы не хотите анализировать каждое целое число, но только IPs, просто проверьте .
для 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 ().Свойство длины
IPAddress someIP;
if (someIP.GetAddressBytes().Length == 4)
{
// IPV4
}
else (someIP.GetAddressBytes().Length == 16)
{
// IPV6
}
else
{
// Unknown
}
Я думаю, должен работать
комбинация тестов, применяемых к строке или 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;
}