تابع getprotobyname() در PHP
تابع getprotobyname() در PHP برای تبدیل نام پروتکل شبکه (مانند “tcp” یا “udp”) به شمارهٔ متناظر آن در سیستم عامل استفاده میشود. این شمارهها بر اساس دیتابیس پروتکلهای سیستم (مثلاً /etc/protocols در یونیکس/لینوکس) یا منابع معادل در ویندوز هستند. تابع برای توسعهدهندگان شبکه که نیاز به مقدار عددی پروتکل دارند مفید است، مثلاً هنگام ساخت سوکت با socket_create().
علامتگذاری تابع و مقدار بازگشتی
امضای تابع بهصورت زیر است:
int|false getprotobyname(string $name)شرح:
- ورودی: نام پروتکل (مثلاً “tcp”, “udp”, “icmp”).
- خروجی: شمارهٔ پروتکل بهصورت عدد صحیح یا
falseدر صورت ناپیدا بودن یا خطا.
مثال ساده: گرفتن شمارهٔ پروتکل
<?php
$tcp = getprotobyname('tcp');
$udp = getprotobyname('udp');
var_dump($tcp, $udp);
?>توضیح: این کد شمارهٔ پروتکلهای TCP و UDP را میگیرد و با var_dump چاپ میکند. در بسیاری از سیستمها مقدار TCP برابر 6 و UDP برابر 17 خواهد بود. اگر نام پروتکل نامعتبر باشد، تابع مقدار false برمیگرداند.
مثال کاربردی: استفاده با socket_create()
<?php
$protocol = getprotobyname('tcp');
if ($protocol === false) {
die('پروتکل پیدا نشد');
}
$sock = socket_create(AF_INET, SOCK_STREAM, $protocol);
if ($sock === false) {
die('ایجاد سوکت ناموفق: ' . socket_strerror(socket_last_error()));
}
// مثال ساده: بستن سوکت
socket_close($sock);
?>توضیح: در این مثال ابتدا شمارهٔ پروتکل TCP گرفته میشود، سپس از آن در socket_create برای ساخت یک سوکت TCP استفاده میشود. بررسیهای خطا نشان میدهد که اگر سیستم نام پروتکل را نداشته باشد یا ساخت سوکت با خطا مواجه شود، برنامه پیام مناسبی صادر میکند.
جدول: پروتکلهای رایج و شمارهها
| نام پروتکل | شماره | توضیح کوتاه |
|---|---|---|
| tcp | 6 | انتقال قابل اعتماد (Stream) |
| udp | 17 | انتقال بدون اتصال (Datagram) |
| icmp | 1 | کنترل و پیامهای خطا (مثلاً ping) |
| esp | 50 | IPsec Encapsulating Security Payload |
نکات فنی و سازگاری
- نتیجهٔ تابع وابسته به دیتابیس پروتکلهای سیستم است؛ پس اگر سیستم شما نام خاصی در فایل پروتکل نداشته باشد، خروجی
falseاست. - در ویندوز برخی نامها ممکن است متفاوت باشند یا قابل دسترسی نباشند؛ بنابراین تست روی سیستم هدف الزامی است.
- تابع فقط نام را به شماره تبدیل میکند و هیچگونه اعتبارسنجی امنیتی یا تبدیل پیچیده دیگری انجام نمیدهد.
ایمنی و بهترین شیوهها
چند نکتهٔ عملی که هنگام استفاده از getprotobyname() باید رعایت کنید:
- هیچگاه ورودی مستقیم کاربر را بدون کنترل در
getprotobynameاستفاده نکنید. ابتدا نام پروتکل را با لیست سفید مقایسه کنید یا از مقدارهای از پیش تعریفشده استفاده کنید. - اگر تابع
falseبرگرداند، از مقدار پیشفرض ایمن استفاده کنید یا خطا را لاگ کنید تا از رفتار غیرمنتظره جلوگیری شود. - برای سازگاری چندسکویی (cross-platform) تست روی سیستمهای هدف را انجام دهید، زیرا نامها و شمارهها میتوانند متفاوت یا غیرفعال باشند.
توابع مرتبط در PHP
چند تابع دیگر که معمولاً همراه با getprotobyname استفاده میشوند:
- getprotobynumber(int $number) — برعکس: نام پروتکل بر اساس شماره.
- getservbyname(string $service, string $protocol) — تبدیل نام سرویس (مثلاً “http”) به شماره پورت با توجه به پروتکل.
- getservbyport(int $port, string $protocol) — گرفتن نام سرویس از پورت و پروتکل.
مثال: ترکیب getprotobyname با getservbyname
<?php
$proto = getprotobyname('udp');
$port = getservbyname('domain', 'udp'); // پورت DNS معمولاً 53
if ($proto === false || $port === false) {
die('پروتکل یا سرویس پیدا نشد');
}
echo "پروتکل UDP شماره: $proto, پورت DNS: $portn";
?>توضیح: در این مثال شمارهٔ پروتکل UDP و پورت سرویس DNS گرفته شدهاند. این ترکیب هنگام راهاندازی سرویسهای شبکه یا اتصال به سرویسهای مشخص مفید است.
خطاها و روشهای رفع مشکل
- اگر تابع همیشه
falseبرمیگرداند، بررسی کنید فایل/etc/protocols(در یونیکس/لینوکس) وجود دارد یا سرویس نامگذاری در سیستم فعال است. - برای دیباگ، نامهای مختلف را امتحان کنید (مثلاً “tcp”, “TCP”, “tcprn” را حذف کنید). تابع اغلب به حروف کوچک حساس نیست اما ورودی باید پاکسازی شود.
- در برنامههای production بهتر است مقادیر مورد نیاز پروتکل را در پیکربندی ثابت کنید تا وابستگی کمتری به محیط اجرای سرور داشته باشید.
نتیجهگیری مختصر
تابع getprotobyname() ابزاری ساده و مفید برای تبدیل نام پروتکل به شمارهٔ متناظر در PHP است که در سناریوهای شبکه و کار با سوکت کاربرد فراوان دارد. با این حال باید به وابستگی آن به دیتابیس پروتکل سیستم، مدیریت خطا و ایمنسازی ورودیها توجه کنید. ترکیب این تابع با توابع مرتبط مانند getprotobynumber و getservbyname امکان پیادهسازی منعطف و سازگار با استانداردهای شبکه را فراهم میکند.
آیا این مطلب برای شما مفید بود ؟



