"संरचना" मॉड्यूल पर भरोसा करने से एंडियन-नेस और प्रकार के आकार के साथ समस्याएं हो सकती हैं, और बस जरूरत नहीं है। और न ही socket.inet_aton () है। पायथन डॉटेड-क्वाड आईपी पते के साथ बहुत अच्छी तरह से काम करता है:
def ip_to_u32(ip):
return int(''.join('%02x' % int(d) for d in ip.split('.')), 16)
मुझे स्वीकार्य सॉर्ट नेटवर्क के एक पूरे सेट के खिलाफ प्रत्येक सॉकेट स्वीकार () कॉल पर आईपी मिलान करने की आवश्यकता है, इसलिए मैं पूर्णांक के रूप में मास्क और नेटवर्क को प्राथमिकता देता हूं:
SNS_SOURCES = [
# US-EAST-1
'207.171.167.101',
'207.171.167.25',
'207.171.167.26',
'207.171.172.6',
'54.239.98.0/24',
'54.240.217.16/29',
'54.240.217.8/29',
'54.240.217.64/28',
'54.240.217.80/29',
'72.21.196.64/29',
'72.21.198.64/29',
'72.21.198.72',
'72.21.217.0/24',
]
def build_masks():
masks = [ ]
for cidr in SNS_SOURCES:
if '/' in cidr:
netstr, bits = cidr.split('/')
mask = (0xffffffff << (32 - int(bits))) & 0xffffffff
net = ip_to_u32(netstr) & mask
else:
mask = 0xffffffff
net = ip_to_u32(cidr)
masks.append((mask, net))
return masks
फिर मैं जल्दी से देख सकता हूं कि क्या एक दिया गया आईपी उन नेटवर्क में से एक है:
ip = ip_to_u32(ipstr)
for mask, net in cached_masks:
if ip & mask == net:
# matched!
break
else:
raise BadClientIP(ipstr)
कोई मॉड्यूल आयात की आवश्यकता नहीं है, और कोड मिलान में बहुत तेज है।