J'ai essayé la solution de Dave Webb mais j'ai rencontré quelques problèmes :
Plus fondamentalement, une correspondance doit être vérifiée en faisant un ET entre l'adresse IP et le masque, puis en vérifiant que le résultat correspond exactement à l'adresse réseau. Et non pas en faisant un ET entre l'adresse IP et l'adresse réseau comme cela a été fait.
J'ai également remarqué que le fait d'ignorer le comportement de l'Endian en supposant que la cohérence vous sauvera ne fonctionne que pour les masques sur les limites d'octets (/24, /16). Pour que les autres masques (/23, /21) fonctionnent correctement, j'ai ajouté un "plus grand que" aux commandes struct et j'ai modifié le code de création du masque binaire pour commencer par tous les "1" et décaler à gauche par (32-mask).
Enfin, j'ai ajouté une simple vérification que l'adresse réseau est valide pour le masque et j'ai simplement imprimé un avertissement si ce n'est pas le cas.
Voici le résultat :
def addressInNetwork(ip,net):
"Is an address in a network"
ipaddr = struct.unpack('>L',socket.inet_aton(ip))[0]
netaddr,bits = net.split('/')
netmask = struct.unpack('>L',socket.inet_aton(netaddr))[0]
ipaddr_masked = ipaddr & (4294967295<<(32-int(bits))) # Logical AND of IP address and mask will equal the network address if it matches
if netmask == netmask & (4294967295<<(32-int(bits))): # Validate network address is valid for mask
return ipaddr_masked == netmask
else:
print "***WARNING*** Network",netaddr,"not valid with mask /"+bits
return ipaddr_masked == netmask
0 votes
Cette question semble être un canonical correct pour les très anciennes réponses 2.x, mais elle est obsolète pour 3.x See Comment organiser et attribuer des canoniques pour "Python/pandas compare adresse IP/CIDR" ?
0 votes
@smci Je ne vois pas pourquoi ; la réponse de phihag à stackoverflow.com/a/1004527/1709587 est une réponse parfaitement bonne pour Python 3 et est là depuis 2014. J'ai annulé votre modification qui invalidait cette réponse.
0 votes
@Staale - Vous devriez mettre à jour votre réponse ici en une qui n'a pas de bogue critique . Les autres réponses utilisent des bibliothèques intégrées pour accomplir la même chose en 1/10e de la quantité de code, sans aucun bogue.