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?

57
demandé sur Josh 2009-04-28 21:36:44

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;
        }
    }
115
répondu Erich Mirabal 2009-04-28 17:48:21

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.

27
répondu Aaronster 2011-04-01 14:53:03
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.

12
répondu Tamas Czinege 2009-04-28 17:45:34

, 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
7
répondu Daniel 2012-02-13 22:59:19

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;
                }
            }
        }
2
répondu King_SaGo 2014-12-12 10:09:43

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

0
répondu Mc_Topaz 2013-04-08 13:59:07

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
répondu JGU 2015-09-21 18:26:16