c# - tengo - direcciones ipv6 reservadas
¿Cómo determinar si una cadena es una dirección IPv4 o IPv6 válida en C#? (7)
Sé que Regex es dangerous para validar direcciones IP debido a las diferentes formas que una dirección IP puede tomar.
He visto preguntas similares para C y C ++, y esas se resolvieron con una función que no existe en C # inet_ntop()
Las soluciones .NET que he encontrado solo manejan el formulario estándar "ddd.ddd.ddd.ddd". ¿Alguna sugerencia?
Puede consultar System.Uri.CheckHostName (value) que devuelve Unknown
, Dns
, IPv4
, IPv6
.
if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
//then ''value'' is a valid IP address or hostname
Puede usar esto para intentar analizarlo:
IPAddress.TryParse
Luego, compruebe AddressFamily
que
Devuelve System.Net.Sockets.AddressFamily.InterNetwork para IPv4 o System.Net.Sockets.AddressFamily.InterNetworkV6 para IPv6.
EDITAR: algunos ejemplos de código. cambiar según lo deseado:
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;
}
}
Puede usar la propiedad IPAddress.GetAddressBytes (). Length
IPAddress someIP;
if (someIP.GetAddressBytes().Length == 4)
{
// IPV4
}
else (someIP.GetAddressBytes().Length == 16)
{
// IPV6
}
else
{
// Unknown
}
Supongo que debería funcionar
Si no desea analizar todos los números enteros, solo las direcciones IP, simplemente marque .
para IPv4 y :
para 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;
}
}
}
Solo una advertencia sobre el uso de System.Net.IpAddress.TryParse()
:
Si le pasa una cadena que contiene un entero (por ejemplo, "3"), la función TryParse lo convertirá en "0.0.0.3" y, por lo tanto, una dirección válida de InterNetworkV4. Por lo tanto, como mínimo, el "0.0.0.3" reformateado debe devolverse a la aplicación del usuario para que el usuario sepa cómo se interpretó su entrada.
Una combinación de pruebas aplicadas a una cadena o IPAddress, funciona para mí ...
/// <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;
}
string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;
bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
Si isValidIp
es verdadero, puede verificar ipAddress.AddressFamily
para determinar si es IPv4 o IPv6. Es AddressFamily.InterNetwork
para IPv4 y AddressFamily.InterNetworkV6
para IPv6.