web-dev-qa-db-fra.com

Comment déterminer si une chaîne est une adresse IPv4 ou IPv6 valide en C #?

Je sais que regex est dangereux pour valider des adresses IP en raison des différentes formes qu’une adresse IP peut prendre.

J'ai vu des questions similaires pour C et C++, qui ont été résolues avec une fonction qui n'existe pas en C # inet_ntop ()

Les solutions .NET que j'ai trouvées ne gèrent que le formulaire standard "ddd.ddd.ddd.ddd". Aucune suggestion?

62
Josh

Vous pouvez l'utiliser pour essayer de l'analyser:

 IPAddress.TryParse

Puis cochez AddressFamily qui

Renvoie System.Net.Sockets.AddressFamily.InterNetwork pour IPv4 ou System.Net.Sockets.AddressFamily.InterNetworkV6 pour IPv6.

EDIT: un exemple de code. changer 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;
        }
    }
126
Erich Mirabal

Juste un avertissement sur l'utilisation de System.Net.IpAddress.TryParse():

Si vous lui transmettez une chaîne contenant un entier (par exemple, "3"), la fonction TryParse la convertira en "0.0.0.3" et, par conséquent, en une adresse InterNetworkV4 valide. Donc, à tout le moins, le "0.0.0.3" reformaté doit être renvoyé à l'application utilisateur pour que l'utilisateur sache comment leur entrée a été interprétée.

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

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

SiisValidIpest vrai, vous pouvez vérifieripAddress.AddressFamilypour déterminer s'il s'agit d'IPv4 ou IPv6. C'est AddressFamily.InterNetwork pour IPv4 et AddressFamily.InterNetworkV6 pour IPv6.

13
Tamas Czinege

Vous pouvez vérifier System.Uri.CheckHostName (valeur) qui retourne Unknown, Dns, IPv4, IPv6

if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
    //then 'value' is a valid IP address or hostname
7
Daniel

Si vous ne souhaitez pas analyser chaque entier, mais uniquement les adresses IP, cochez 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;
                }
            }
        }
3
King_SaGo

Vous pouvez utiliser la propriété IPAddress.GetAddressBytes (). Length

        IPAddress someIP;

        if (someIP.GetAddressBytes().Length == 4)
        {
            // IPV4
        }
        else (someIP.GetAddressBytes().Length == 16)
        {
            // IPV6
        }
        else
        {
            // Unknown
        }

Je suppose que ça devrait marcher

0
Mc_Topaz

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