85 votes

Comment vérifier une IP d'entrée tombe dans une plage d'adresses IP spécifique

Si nous permettons aux utilisateurs de saisir quelques plages d'adresses IP, par exemple 172.16.11.5 - 100, comment pourrais-je écrire une fonction pour vérifier si une adresse IP (172.16.11.50) se situe dans ces plages?

Existe-t-il une bibliothèque existante dans .NET à exploiter?

134voto

Richard Szalay Points 42486

Il n'y a rien construit dans le cadre, mais il ne serait pas beaucoup d'efforts à créer un IPAddressRange classe.

Vous auriez comparer les gammes en appelant IPAddress.GetAddressBytes sur le bas de l'adresse, de la partie supérieure de l'adresse et de comparaison de l'adresse. En commençant le premier octet, vérifier si la comparaison de l'adresse est dans la gamme de la partie supérieure/inférieure de l'adresse.

Cette méthode fonctionne pour les adresses IPv4 et IPv6.

public class IPAddressRange
{
    readonly AddressFamily addressFamily;
    readonly byte[] lowerBytes;
    readonly byte[] upperBytes;

    public IPAddressRange(IPAddress lower, IPAddress upper)
    {
        // Assert that lower.AddressFamily == upper.AddressFamily

        this.addressFamily = lower.AddressFamily;
        this.lowerBytes = lower.GetAddressBytes();
        this.upperBytes = upper.GetAddressBytes();
    }

    public bool IsInRange(IPAddress address)
    {
        if (address.AddressFamily != addressFamily)
        {
            return false;
        }

        byte[] addressBytes = address.GetAddressBytes();

        bool lowerBoundary = true, upperBoundary = true;

        for (int i = 0; i < this.lowerBytes.Length && 
            (lowerBoundary || upperBoundary); i++)
        {
            if ((lowerBoundary && addressBytes[i] < lowerBytes[i]) ||
                (upperBoundary && addressBytes[i] > upperBytes[i]))
            {
                return false;
            }

            lowerBoundary &= (addressBytes[i] == lowerBytes[i]);
            upperBoundary &= (addressBytes[i] == upperBytes[i]);
        }

        return true;
    }
}

NB: Le code ci-dessus pourrait être étendu à ajouter public static méthodes de fabrique FromCidr(IPAddress address, int bits)

69voto

BuddhiP Points 2092

Pour ceux qui vérifient cette question:

Vous voudrez peut-être examiner cette bibliothèque par @jsakamoto, qui semble fonctionner assez bien:

https://github.com/jsakamoto/ipaddressrange

il peut également être installé via NuGet:

http://www.nuget.org/packages/IPAddressRange/

26voto

artwl Points 1152
public static bool IsInRange(string startIpAddr, string endIpAddr, string address)
{
    long ipStart = BitConverter.ToInt32(IPAddress.Parse(startIpAddr).GetAddressBytes().Reverse().ToArray(), 0);
    long ipEnd = BitConverter.ToInt32(IPAddress.Parse(endIpAddr).GetAddressBytes().Reverse().ToArray(), 0);
    long ip = BitConverter.ToInt32(IPAddress.Parse(address).GetAddressBytes().Reverse().ToArray(), 0);
    return ip > ipStart && ip < ipEnd;
}
Console.WriteLine(IsInRange("100.0.0.1", "110.0.0.255", "102.0.0.4"));//true

4voto

Aim Kai Points 2437

J'ai déjà utilisé ce code sur codeproject, ce qui peut vous être utile.

http://www.codeproject.com/KB/IP/ipnumbers.aspx

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