it-swarm.com.de

Wie können Sie feststellen, ob eine Zeichenfolge eine gültige IPv4- oder IPv6-Adresse in C # ist?

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?

62
Josh

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;
        }
    }
126
Erich Mirabal

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.

28
Aaronster
string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;

bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);

WennisValidIptrue 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.

13
Tamas Czinege

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
7
Daniel

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;
                }
            }
        }
3
King_SaGo

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

0
Mc_Topaz

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;
    }
0
JGU