Test d'appartenance d'une adresse ip à un sous-réseau en notation cidr

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 337 fois - Téléchargée 30 fois

Contenu du snippet

Ayant besoin de trouver le site Active Directory le plus approprié pour adresser un serveur (une machine UNIX avec un serveur CIFS, et donc qui ne répond à aucune des API standard), j'ai écrit cette fonction qui teste l'appartenance d'une adresse IP à un sous-réseau en notation CIDR.

Source / Exemple :


' ---
' --- Teste l'appartenance d'une adresse IP à un sous-réseau en notation CIDR
' ---
Function AddressBelongsToCIDRSubnet(sIPAddress As String, sIPSubnetnetName As String) As Boolean
On Error Resume Next
  AddressBelongsToCIDRSubnet = False

  Dim i As Integer
  
  i = InStr(sIPSubnetnetName, "/")
  If (i = 0) Then _
    Exit Function
    
  Dim sIPSubnet As String
  Dim nMask As Integer
  sIPSubnet = Left(sIPSubnetnetName, i - 1)
  nMask = CInt(Mid(sIPSubnetnetName, i + 1))
  
' --- Faudrait que je regarde quelles sont les limites admises par la notation
' --- CIDR
  If (nMask < 1) Or (nMask > 32) Then _
    Exit Function
  
  Dim d1 As Long
  Dim d2 As Long
  Dim d3 As Long
  Dim d4 As Long
  Dim vTab1 As Variant
  Dim vTab2 As Variant
  Dim s2 As String
  Dim s4 As String
  
  vTab1 = Split(sIPSubnet, ".")
  If (UBound(vTab1) <> 3) Then _
    Exit Function
  
  vTab2 = Split(sIPAddress, ".")
  If (UBound(vTab2) <> 3) Then _
    Exit Function
  
' --- Saloperie de VB qui ne sait pas manipuler les long non signés
  If (nMask <= 16) Then
    d1 = ((2 ^ (16 - nMask)) - 1) Xor CLng("&hFFFF")
  
    d2 = CDbl(vTab1(0)) * 256 + CDbl(vTab1(1))
    d3 = CDbl(vTab2(0)) * 256 + CDbl(vTab2(1))
    d4 = d3 And d1
  Else
    If (CInt(vTab1(0)) <> CInt(vTab2(0))) Or (CInt(vTab1(1)) <> CInt(vTab2(1))) Then _
      Exit Function
    
    d1 = ((2 ^ (16 - (nMask - 16))) - 1) Xor CLng("&hFFFF")
    d2 = CDbl(vTab1(2)) * 256 + CDbl(vTab1(3))
    d3 = CDbl(vTab2(2)) * 256 + CDbl(vTab2(3))
    d4 = d3 And d1
  End If
  
' --- La translation en chaine hexa n'est pas vraiment nécessaire mais je trouve ça plus visuel au
' --- débogage
  s2 = Hex$(CLng(d2))
  s4 = Hex$(CLng(d4))
  If (s4 = s2) Then AddressBelongsToCIDRSubnet = True

End Function

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.