Ich weiß, dass Regex dangerous für die Überprüfung von IP-Adressen ist, da die verschiedenen IP-Adressen unterschiedlich sein können.
Ich habe ähnliche Fragen für C und C++ gesehen, und diese wurden mit einer Funktion gelöst, die in C # inet_ntop () nicht vorhanden ist.
Die .NET-Lösungen, die ich gefunden habe, behandeln nur das Standardformular "ddd.ddd.ddd.ddd". Irgendwelche Vorschläge?
Sie können dies verwenden, um es zu analysieren und zu analysieren:
IPAddress.TryParse
Dann prüfen Sie AddressFamily
welche
Gibt System.Net.Sockets.AddressFamily.InterNetwork für IPv4 oder System.Net.Sockets.AddressFamily.InterNetworkV6 für IPv6 zurück.
EDIT: ein Beispielcode. nach Wunsch ändern:
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;
}
}
Nur eine Warnung zur Verwendung von System.Net.IpAddress.TryParse()
:
Wenn Sie einen String übergeben, der eine ganze Zahl enthält (z. B. "3"), wird die TryParse-Funktion diese in "0.0.0.3" und somit eine gültige InterNetworkV4-Adresse konvertieren. Zumindest sollte das umformatierte "0.0.0.3" an die Benutzeranwendung zurückgegeben werden, damit der Benutzer weiß, wie seine Eingabe interpretiert wurde.
string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;
bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
WennisValidIp
true ist, können Sie mitipAddress.AddressFamily
überprüfen, ob es sich um IPv4 oder IPv6 handelt. Es ist AddressFamily.InterNetwork
für IPv4 und AddressFamily.InterNetworkV6
für IPv6.
Sie könnten auschecken System.Uri.CheckHostName (Wert) das gibt Unknown
, Dns
, IPv4
, IPv6
zurück.
if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
//then 'value' is a valid IP address or hostname
Wenn Sie nicht jede ganze Zahl, sondern nur IPs analysieren möchten, überprüfen Sie einfach .
für IPv4 und :
für 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;
}
}
}
Sie können die IPAddress.GetAddressBytes (). Length -Eigenschaft verwenden
IPAddress someIP;
if (someIP.GetAddressBytes().Length == 4)
{
// IPV4
}
else (someIP.GetAddressBytes().Length == 16)
{
// IPV6
}
else
{
// Unknown
}
Ich denke, sollte funktionieren
Eine Kombination von Tests, die auf einen String oder eine IP-Adresse angewendet werden, funktioniert für mich.
/// <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;
}