70 votes

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

Je sais regex est dangereux pour la validation des adresses IP en raison des différentes formes d'une adresse IP peut prendre.

J'ai vu les mêmes questions pour le C et le C++, et ceux qui ont été résolus avec une fonction qui n'existe pas en C# inet_ntop()

L' .NET solutions que j'ai trouvé seulement gérer le standard "ddd".ddd.ddd.ddd" forme. Toutes les suggestions?

141voto

Erich Mirabal Points 6029

Vous pouvez utiliser cela pour tenter de l'analyser:

 IPAddress.TryParse

Ensuite, vérifiez AddressFamily qui

Système De Retours.Net.Les Sockets.AddressFamily.Réseau d'interconnexion pour IPv4 ou d'un Système.Net.Les 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;
        }
    }

29voto

Aaronster Points 776

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

Si vous passez une chaîne de caractères contenant un nombre entier (par exemple, "3") le TryParse fonction convertir en "0.0.0.3" et, par conséquent, valide InterNetworkV4 adresse. Donc, à tout le moins, la reformaté "0.0.0.3" doit être retourné à la demande de l'utilisateur afin que l'utilisateur sait comment leur entrée a été interprété.

14voto

Tamas Czinege Points 49277
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 l' ipAddress.AddressFamily afin de déterminer si c'est IPv4 ou IPv6. Il est AddressFamily.InterNetwork pour l'IPv4 et l' AddressFamily.InterNetworkV6 pour IPv6.

7voto

Daniel Points 319

Vous pouvez vérifier le Système.Uri.CheckHostName( valeur ) renvoie Unknown , Dns, IPv4, IPv6.

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

0voto

Mc_Topaz Points 21

Vous pouvez utiliser l'adresse ip.GetAddressBytes().La longueur de la propriété

        IPAddress someIP;

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

Je suppose que devrait fonctionner

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X