نحتاج أحيانًا إلى تحديد ما إذا كان عنوان IP معين ينتمي إلى مقطع شبكة لتحديد ما إذا كان بإمكان المستخدم الوصول إلى النظام.
على سبيل المثال، عنوان IP الخاص بالمستخدم الذي قام بتسجيل الدخول هو 218.6.7.7، ويجب على برنامجنا تحديد ما إذا كان ينتمي إلى قطاع الشبكة 218.6.0.0/16 (حيث /16 هو تمثيل قناع الشبكة الفرعية الجديد، أي ما يعادل 255.255.0.0) .
لتحقيق مثل هذه الوظيفة، تقوم الخوارزمية الشائعة الآن بتحويل 218.6.0.0 و218.6.7.7 إلى رقم عشري استنادًا إلى 256 ومقارنتهما. على سبيل المثال، قم أولاً بحساب الرقم العشري 218.6.0.0 و218.6.255.255: 218×256×256. ×256+6×256×256=3657826304، 218×256×256×256+6×256×256+255×256×256+255=3657891839. ثم احسب العلامة العشرية لـ 218.6.7.7: 218×256×256×256+6×256×256+7×256+7=3657828103، وأخيرًا قارن ما إذا كان 3657828103 أكبر من أو يساوي 3657826304 وأقل من أو يساوي 3657891839 . ولكن من الواضح أن هناك مشكلة، حيث أن مبلغ الحساب كبير جدًا والقيمة كبيرة جدًا. إذا كان عنوان IP يبدأ بـ 61، فلا بأس إذا بدأ بـ 218، فسيؤدي ذلك إلى تجاوز البيانات والخطأ.
في الواقع، أفضل طريقة لمقارنة ما إذا كان عنوان IP ينتمي إلى مقطع شبكة معين هو تحويل مقطع IP والشبكة إلى ثنائي 32 بت، ثم مقارنة ما إذا كانت أجزاء الشبكة الخاصة بهم متماثلة أم لا الدالة، لذلك من الضروري تنفيذها، ولا يمكننا تنفيذ ذلك إلا يدويًا، كما يلي:
'تحويل العلامة العشرية إلى سلسلة ثنائية
الدالة dec2bin(octNumber)
فارا=octNumber
يفعل
dec2bin=cstr(vara mod 2) & dec2bin
فارا=فارا 2
حلقة حتى فارا = 0
وظيفة النهاية
"حشو السلسلة الثنائية إلى 8 بتات."
لوحة الوظائف (شارع)
Pad=right("00000000" & str,8)
وظيفة النهاية
"تحديد ما إذا كان عنوان IP."
الدالة هيIp(ipad)
isIp=false
set oReg=new RegExp
oReg.IgnoreCase=true
oReg.global=صحيح
oReg.Pattern = "(d{1,4}.d{1,4}.d{1,4}.d{1,4})|(d{1,4} .d{1,4}.d{1,4}.d{1,4}/d{1,2})"
إذا كان oReg.test(ipadd) فإن isIp=true
تعيين oReg=لا شيء
وظيفة النهاية
"حيث يكون UserIP هو عنوان IP الذي نريد اكتشافه."
'NetIP هو مقطع الشبكة أو عنوان IP معين سيتم اكتشافه. استخدم xxx.xxx.xxx.xxx/N لتمثيل مقطع الشبكة، حيث يمثل N عدد أرقام قناع الشبكة الفرعية.
'ملاحظة، هذا البرنامج هو برنامج أصلي لشركة Global Wanwei، لذا إذا كنت ترغب في إعادة طباعته، فيرجى الاحتفاظ بالمعلومات المصدرية، شكرًا لك.
'البرمجة: Global Wanwei المتخصصة في تسجيل أسماء النطاقات وخدمات الاستضافة الافتراضية
"الموقع الإلكتروني: http://www.netInter.cn
'المعلومات الواردة أعلاه جزء لا يتجزأ من نص المقالة، لذا إذا كنت تريد إعادة طباعة هذه المقالة، فيجب عليك الاحتفاظ بالمعلومات المذكورة أعلاه
.
currentip=UserIp
Collection_ips=split(iplist,") 'قم بتقسيم الشبكة إلى 4 أجزاء بالنقاط.'
check_ip=false 'قيمة الوظيفة الأولية، false تفترض أن عنوان IP غير موجود في مقطع الشبكة هذا
NetIP=تقليم(NetIP)
slashPos=inStr(NetIP,"/")
إذا كان slashPos=0 فإن "مقطع الشبكة لا يحتوي على الرمز /، فهو مجرد عنوان IP، لذا فقط قارن السلاسل لمعرفة ما إذا كانت متطابقة."
إذا NetIP =currentip ثم
check_ip=true 'check_ip=true يعني أن عناوين IP متساوية
وظيفة الخروج
نهاية إذا
آخر
netRang=mid(NetIP,slashPos+1) 'احصل على الرقم بعد /
إذا لم يكن isNumeric(netRang) إذن "/ لم يكن متبوعًا برقم، فإن التنسيق غير صحيح."
وظيفة الخروج
نهاية إذا
netRang=cint(netRang) "تحويل الأحرف إلى أرقام."
إذا netRang> 31 ثم
لا يمكن أن يتجاوز الرقم بعد وظيفة الخروج '/ 32 رقمًا
نهاية إذا
ipsets=split(currentip,".") 'قسّم عنوان IP الخاص بالمستخدم إلى أربعة أجزاء حسب النقاط
C_IP_BIN=pad(dec2bin(ipsets(0))) & Pad(dec2bin(ipsets(1))) & Pad(dec2bin(ipsets( 2)) ))) & الوسادة(dec2bin(ipsets(3)))
'السطر أعلاه هو تحويل عنوان IP الخاص بالمستخدم يدويًا إلى عنوان ثنائي مطابق مكون من 32 حرفًا
ipsets=split(NetIP,".") 'اتبع العملية المذكورة أعلاه لتحويل IP الخاص بمقطع الشبكة إلى عنوان ثنائي مكون من 32 حرفًا
sPos=instr(ipsets(3),"/") 'يجب أن يكون التنسيق الأخير عبارة عن أرقام/أرقام
إذا sPos = 0 ثم
وظيفة الخروج
نهاية إذا
ipsets(3)=left(ipsets(3),sPos-1) 'احصل على الرقم الأخير/السابق
S_IP_BIN=pad(dec2bin(ipsets(0))) & Pad(dec2bin(ipsets(1))) & Pad(dec2bin(ipsets(2))) & Pad(dec2bin(ipsets(3))))
'قم بتحويله إلى ملف ثنائي مكون من 32 حرفًا
إذا left(C_IP_BIN,netRang) = left(S_IP_BIN,netRang) ثم "من خلال مقارنة ما إذا كانت قطاعات الشبكة متماثلة، يمكنك تحديد ما إذا كان عنوان IP الخاص بالمستخدم ينتمي إلى مقطع شبكة معين."
check_ip=true
نهاية إذا
نهاية إذا
مثال على تطبيق
الوظيفة النهائية
:لتحديد ما إذا كان 61.139.1.1 موجودًا في مقطع الشبكة 61.139.0.0/16 (255.255.0.0)، ما عليك سوى استخدام هذه الوظيفة ببساطة، مثل:
if check_ip("61.139.1.1"، و61.139 0.0/16") ثم
Response.write "نفس مقطع الشبكة"
آخر
Response.write "ليس نفس مقطع الشبكة"
نهاية إذا