تابعی برای تشخیص کلاس IP در PHP

نشانی پروتکل اینترنت (به انگلیسی: Internet Protocol Address) یا به اختصار نشانی آی‌پی (به انگلیسی: IP Address) نشانی عددی است که به هریک از دستگاه‌ها و رایانه‌های متصل به شبکهٔ رایانه‌ای که بر مبنای نمایه TCP/IP (از جمله اینترنت) کار می‌کند، اختصاص داده می‌شوند. (ویکی‌پدیا)

در نسخه‌ی چهارم آی‌پی، با یک عدد سی و دو بیتی طرف هستیم؛ کسی که کمی با این ساختار آشنا باشد، با دیدن یک آی‌پی می‌داند که در چه کلاسی قرار دارد، و با شناخت کلاس می‌توان اطلاعات دیگری را فهمید که البته به بحث امشب ما بی‌ارتباط است.

کلاس‌های آی‌پی نسخه‌ی چهار
کلاس‌های آی‌پی نسخه‌ی چهار

نقشه‌ای که کشیده‌ایم این است: بخش اول آدرس آی‌پی را بررسی می‌کنیم و بر اساس جدولی که مشاهده کردید، کلاسی که به آن تعلق دارد را پیدا می‌کنیم؛ کدی که نوشته‌ام را چند بار با دقت بخوانید:

function getIPClass($ip) {
	sscanf($ip, '%d.%d.%d.%d', $s1, $s2, $s3, $s4);
	if ($s1 <= 126) {
		return 'A';	
	} elseif ($s1 >= 128 && $s1 <= 191) {
		return 'B';
	} elseif ($s1 >= 192 && $s1 <= 223) {
		return 'C';
	} elseif ($s1 >= 224 && $s1 <= 239) {
		return 'D';
	} elseif ($s1 >= 240 && $s1 <= 255) {
		return 'E';
	}
	return 'Loopback';
}

بسیار ساده و مبتدی‌پسند است (پس آن را می‌پسندم!): تابعی به نام getIPClass نوشته‌ایم که تنها یک پارامتر می‌گیرد؛ یک آدرس آی‌پی که در نوع رشته‌ای فرستاده می‌شود. یکی از شما زحمت صدازدن تابع را متقبل شود تا توضیحات را شروع کنیم!

$class = getIPClass('192.168.1.1');

متشکرم! حال یک رشته که آدرس آی‌پی است در اختیار داریم، و نیاز به جداکردن چهار بخش آی‌پی داریم تا بر اساس جدول راجع به اینکه در چه کلاسی قرار می‌گیرد قضاوت کنیم! از تابع sscanf استفاده کرده‌ام و هر چهار بخش را در متغیرهای s1 تا s4 می‌ریزم؛ پارامتر اول، رشته‌ی ورودی، و پارامتر دوم، قالبِ ورودی است.

بعد از این بر اساس جدول کلاس‌ها عمل کرده و با استفاده از چند شرط پیاپی، می‌بینم که بخش اول آدرس آی‌پی در کدام بازه قرار دارد. بعد از آخرین شرط، مقدار "Loopback" را return کرده‌ام و البته یک دلیل بسیار موجه و قانع‌کننده دارم: اگر آدرس با 127 شروع شود، نه می‌توان آن را در کلاس A و نه کلاس B گذاشت، زیرا این عدد در آن بازه نیست و حسابش از آنها جدا است؛ احتمالاً ایشان را بشناسید، نام localhost را نمایندگی می‌کنند!

در آخر کلاسی که IP به آن تعلق دارد از تابع برگشت داده می‌شود و متغیر class با آغوش باز آن را خواهد پذیرفت! آیا این مقاله در سطح پیشرفته بود؟ ابداً، هدف تنها یک تمرین ساده ولی کاربردی برای نشان‌دادن این نکته‌ی مهم بود که با تبدیل‌کردن مطالبی که قبلاً آموخته‌ایم به کدهایی ساده، می‌توانیم آنها را کاربردی کنیم.

آیا این کد بی‌نقص است؟ هرگز، ما اعتبار آدرس‌های آی‌پی را در این تابع بررسی نکرده‌ایم و اگر کسی 7000.1.1.1 را به تابع ما بفرستد، جوابش همچنان "Loopback" است!

آیا امکان نوشتن این تابع به روش ساده‌تری هم هست؟ جواب این سؤال را به ذهن‌های خلاق و سمج شما می‌سپارم، کادر کامنت در انتظار شماست...!