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
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.