"স্ট্রাক্ট" মডিউলটির উপর নির্ভর করা এন্ডিয়ান-নেস এবং টাইপ আকারগুলির সাথে সমস্যা সৃষ্টি করতে পারে এবং কেবল প্রয়োজন হয় না। অথবা সকেট.ইনেট_টোন ()। পাইথন ডটেড-কোয়াড আইপি অ্যাড্রেসগুলির সাথে খুব ভালভাবে কাজ করে:
def ip_to_u32(ip):
return int(''.join('%02x' % int(d) for d in ip.split('.')), 16)
আমাকে প্রতিটি সকেট গ্রহণযোগ্য () কলটিতে মেনে চলার অনুমতিযোগ্য উত্স নেটওয়ার্কগুলির পুরো সেটটির বিপরীতে করা দরকার, সুতরাং আমি মুখোশ এবং নেটওয়ার্কগুলিকে পূর্ণসংখ্যা হিসাবে প্রতিরোধ করি:
SNS_SOURCES = [
'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
তারপরে আমি দ্রুত দেখতে পাচ্ছি যে প্রদত্ত আইপি networks নেটওয়ার্কগুলির মধ্যে একটির মধ্যে রয়েছে কিনা:
ip = ip_to_u32(ipstr)
for mask, net in cached_masks:
if ip & mask == net:
break
else:
raise BadClientIP(ipstr)
কোনও মডিউল আমদানির প্রয়োজন নেই, এবং কোডটি খুব দ্রুত মিলছে।