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)