Comment déterminer si une chaîne est une adresse IPv4 ou IPv6 valide en C#?
Je sais que regex est dangereux pour valider les adresses IP en raison des différentes formes qu'une adresse IP peut prendre.
J'ai vu des questions similaires pour C et c++, et celles-ci ont été résolues avec une fonction qui n'existe pas dans C # inet_ntop()
Les solutions. net que j'ai trouvées ne gèrent que le " ddd " standard.ddd.ddd.DDD " forme. Toutes les suggestions?
7 réponses
Vous pouvez l'utiliser pour essayer de l'analyser:
IPAddress.TryParse
Puis vérifiez AddressFamily
Qui
Renvoie System. Net. Sockets.AddressFamily.InterNetwork pour IPv4 ou System.Net.Sockets.AddressFamily. InterNetworkV6 pour IPv6.
EDIT: un exemple de code. modifier comme vous le souhaitez:
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;
}
}
Juste un avertissement sur l'utilisation de System.Net.IpAddress.TryParse()
:
Si vous lui passez une chaîne contenant un entier (par exemple "3"), la fonction TryParse la convertira en "0.0.0.3" et, par conséquent, une adresse internetworkv4 valide. Ainsi, à tout le moins, le reformaté "0.0.0.3" doit être retourné à l'application utilisateur afin que l'utilisateur sache comment son entrée a été interprétée.
string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;
bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
Si isValidIp
est vrai, vous pouvez vérifier ipAddress.AddressFamily
pour déterminer si c'est IPv4 ou IPv6. C'est AddressFamily.InterNetwork
pour IPv4 et AddressFamily.InterNetworkV6
pour IPv6.
, Vous pouvez vérifier Système.URI.CheckHostName( valeur ) qui renvoie Unknown
, Dns
, IPv4
, IPv6
.
if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
//then 'value' is a valid IP address or hostname
Si vous ne voulez pas analyser chaque entier, mais seulement IPs, vérifiez simplement .
pour IPv4 et :
pour 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;
}
}
}
Vous pouvez utiliser L'adresse IP.GetAddressBytes ().Propriété longueur
IPAddress someIP;
if (someIP.GetAddressBytes().Length == 4)
{
// IPV4
}
else (someIP.GetAddressBytes().Length == 16)
{
// IPV6
}
else
{
// Unknown
}
Je suppose que devrait fonctionner
Une combinaison de tests appliqués à une chaîne ou à une adresse IP, fonctionne pour moi..
/// <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;
}