Get Adobe Flash player

شروع برنامه نویسی سوکت

PHP همه کاره:

خب برنامه نویسی سوکت خیلی مهم است، و قابلیت‌های که داره خیلی فاز میده ! php به غیر از تابع  fsockopen و توابع  Curl که یک سری کارهای ساده و پر استفاده رو انجام می‌دن، توابع تقریباً کاملی رو برای کار با سوکت داره (که مطمئناً روی هاست‌های شیر نصب نیست) .

برای کار با سوکت و  باز کردن پورت و این‌ها نیاز به برنامه‌ای است که به صورت دائم باز باشه  . خب php این امکان رو از طریق وب‌سرور نداره (یا خیلی بد قلق داره ) ولی از طریق CLI و یا php-gtk این قابلیت رو خیلی عالی داره و این امکان رو به شما میده که هر برنامه‌ای که دوست دارین بنویسین !

اگه به بسته های  PECL و PEAR این زبان نگاهی بندازین متوجه می‌شین که تقریباً هر کاری با php می‍شه کرد هر کاری ! حتی  ارتباط با زبان‌های دیگه که php رو کامل می‌کنه! البته این زبان برای این کارها ساخته نشده و مسلماً استفاده از زبان‌های دیگه برای برنامه نویسی سوکت و کارهای مختلف در جاهای مختلف بهتره

 

بهترین روش برای اجرای اسکریپ های سوکت

اگر می‌خواین یک برنامه نویسی سوکت درست حسابی بکنید ! اول وب‌سرور رو کلاً بگذارید کنار !و برین سراغ سورس خود php. اگر از php-gtk (رابط گرافیکی کاربر )  استفاده کنید که بهترین انتخاب رو کردین اینجا توضیحاتی برای کار با php-gtk دادم 

بعد از دریافت خود  php از سایتش  (فرض کنیم فولدر php رو در آدرس c:/php قرار دادین)  اسکریپتِ مورد نظر رو  بنویسید و در همون فولدر php مثلاً با اسم test.php ذخیره کنید . بعد با جرا کردن دستور c:/php/php.exe test.php  در cmd اسکریپ اجرا میشه.

برای جلوگیری از بسته شدن برنامه هم از یک حلقه بی‌انتها استفاده کنید while(true) .

لازمه که extention سوکت رو فعال کنید برای همین وارد php.ini شده و خط extension=php_sockets.dll; رو پیدا کنید و نقطه ویرگول سر خط رو حذف کنید (در لینوکس –enable-sockets ) تا توابع سوکت فعال بشه .

 

توابع – نقطه شروع

PHP در حال حاظر  ۲۶ تابع برای کار با سوکت (در این extention ای که نصب کردین ) داره ، یکی از دو تابع زیر اولین نقطه شما برای کار با سوکت هستند

socket_create :
ساخت یک سوکت (۳ آرگومان ورودی این تابع برای انتخاب نوع سوکت و پروتکل )
socket_create_listen :
ساخت یک سوکت AF_NET (همون IPv4 ) و گوش دادن به یک پورت (ارگومان اول تابع) ، این تابع  در حقیقت  روش سریع برای گوش دادن به  پورت انتخاب شده است و دارای سیستم خاصی نسبت به تابع socket_create نیست، یعنی کار رو برای کسانی که می‌خوان مستقیم برن سراغ listen کردن یک پورت راحت می‌کنه

این دو تابع خروجی resource به شما می‌دن، که شما می‌توانید با یکی از این‌ها (برای یک کانکشن) شروع کنید . ما اینجا از تابع  socket_create   استفاده می‌کنیم تا همه چیز رو مرحله به مرحله دستی تنظیم کنیم .

 

تابع  socket_create نقطه شروع
این تابع ۳ آرگومان ورودی میگیره که این ۳ آرگومان از نوع ثابت هستند  .


آرگومان اول :
 ورژن IP یا خانواده پروتکل  که یکی از ۳ مقدار  AF_NET (برای استفاده از IPv4 ) و AF_INET6 (برای استفاده از IPv6) حالت سوم هم  AF_UNIX که برای نوعی سوکت مخصوص سیستم عامل های یونیکس ِ که من اطلاعاتی در موردش ندارم . در ضمینه کاری ما همیشه مقدار این آرگومان AF_NET است
آرگومان دوم :
 این آرگومان نوع ارتباطی است که سوکت برقرار می‌کنه و یکی از ۵ ثابت زیره
۱- SOCK_STREAM : ارتباط اتصال‌گرا دو طرفه و قابل اعتماد به صورت STRAM ، پایه پروتکل TCP بر روی این نوع سوکت است
۲- SOCK_DGRAM : ارتباط غیر اتصال‌گرا  ، پایه پروتکل UDP بر روی این نوع سکوت است
۳- SOCK_SEQPACKET :
5-  SOCK_RAW
6-  SOCK_RDM
آرگومان سوم :
نوع پروتکل  که یکی از ۳ مقدار  SOL_UDP (غیراتصال‌گرا) , SOL_TCP (اتصال‌گرا) و  icmp

1
2
$sock = socket_create(AF_NET,SOCK_DGRAM,SOL_UDP);
socket_close($sock);

در مثال بالا یک سوکت  برای IPv4 از نوع DGRAM و پروتکل UDP ساخته شده و در خط دوم سوکت بسته شده . یک مثال مناسب برای UDP سرویس‌های  VOP  است (voice over IP) مثل برنامه‌های Skype یا ooVoo

1
2
$sock = socket_create(AF_NET,SOCK_STREAM,SOL_TCP);
socket_close($sock);

این هم یک مثال از یک سوکت برای IPv4 از نوع STREAM و پروتکل  TCP . یک از مثال‌های خوب برای این نوع سوکت  سرویس‌های HTTP , FTP است
 اتصال ، باز کردن پورت و گوش‌دادن به پورت (listen)


بعد از اینکه سوکت مورد نظر رو ساختید حالا شما چند انتخاب دارین که خارج سه مورد زیر نیست
۱- اتصال به پورت و IP مقصد
۲- باز کردن پورت بر روی سیستم مبدا  و گوش‌دادن
۳- هر دو
برای اینکه یک پورت بر روی  سرور مبدا (سرور خودتان ) باز کنید  بعد از ساخت سوکت از تابع socket_bind  استفاده کنید  . این تابع ۳ آرگومان می‌گیرد
آرگومان اول :
متغییر نوع resource از خروجی تابع socket_create
آرگومان دوم :
آدرس IP مبدا (IP سرور خود را وارد کنید) توجه داشته باشید که برای این سرویس باید IP ثابت داشته باشید
آرگومان سوم :
شماره پورت مبدا . پورتی که می‌خواهید روی سیستم خود باز کنید  این ارگومان دلخواهی است خروجی این تابع boolean است که در صورت خطا false و اتصال موفقیت آمیز true برمی‌گرداند

۱
۲
۳
۴
۵
۶
۷
$sock = socket_create(AF_NET,SOCK_STREAM,SOL_TCP);

if(!socket_bind($sock,'127.0.0.1',8080)){ // Bind the source address
exit('ERROR');
}

socket_close($sock);

بعد از اتصال به IP و پورت مبدا  برای شروع  listening گوش‌دادن (گوش‌دادن به اطلاعاتی که روی پورت و IP مشخص شده شما نوشته می‌شود ) از تابع socket_listen را اجرا کنید

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
<?php

$sock = socket_create(AF_NET,SOCK_STREAM,SOL_TCP); // create a tcp stream socket

if(!socket_bind($sock,'127.0.0.1',8080) or // Bind the source address
!socket_connect($sock, '173.244.165.146', 80) or // Connect to destination address
!socket_listen($sock) // Start listening
){
exit('ERROR');
}
socket_close($sock);

?>

حالا شما می‌توانید به وسیله تابع  socket_read اطلاعاتی را که روی سوکت نوشته می‌شود را بخوانید . این تابع ۳ آرگومان ورودی دارد
آرگومان اول :
متغییر نوع resource از خروجی تابع socket_create
آرگومان دوم :
تعداد بایت اطلاعاتی که می‌خواهید از سوکت بخوانید
آرگومان سوم :
که نوع خواندن است و می‌تواند یکی از دو ثابت PHP_BINARY_READ (مقدار پیشفرض ، خواندن اطلاعات به صورت باینری ) ، PHP_NORMAL_READ ( اگر به کارکترهای /r/n برسد متوقف می‌شود ، خواندن تا سرخط )

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
۲۱
۲۲
<?php

$sock = socket_create(AF_NET,SOCK_STREAM,SOL_TCP); // create a tcp stream socket

if(!socket_bind($sock,'127.0.0.1',8080) or // Bind the source address
!socket_connect($sock, '173.244.165.146', 80) or // Connect to destination address
!socket_listen($sock) // Start listening
){
exit('ERROR');
}

while(true){

$recive = socket_read($sock, 1024); // read data from socket (writed by 173.244.165.146)
if($recive!=''){
echo $recive;
}

}
socket_close($sock);

?>

در کد بالا بعد از تابع  bind یک حلقه بی انتها گذاشته شده که دائم تابع  socket_read رو اجرا می‌کنه به محض  اینکه اطلاعاتی روی سوکت نوشته بشه در صفحه چاپ میشه . و حالا اینجا یک نکته قابل ذکره در اول بحث گفتیم که تابع socket_create_listen کار خاصی انجام نمی‌ده و فقط کار رو راحت می‌کنه خب خیلی راحت می‌تونین کد بالا رو با این تابع به شکل زیر خلاصه کنید

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
<?php

$sock=socket_create_listen(8080);

while(true){

$recive = socket_read($sock, 1024); // read data from socket (writed by 173.244.165.146)
if($recive!=''){
echo $recive;
}

}
socket_close($sock);

?>

دو تابع دیگر برای خواندن اطلاعات است socket_recv و socket_recvfrom که در ادامه توضیح  میدم

 

اتصال به مقصد ، نوشتن و ارسال اطلاعات به مقصد

و حالا انتخاب مقصد برای اتصال به IP و پورت مقصد از تابع socket_connect استفاده میشه این تابع ۳ آرگومان ورودی می‌گیره
آرگومان اول :
 متغییر نوع resource از خروجی تابع socket_create
آرگومان دوم :
آدرس IP مقصد مورد نظر
آرگومان سوم :
آدرس پورت مقصد که این آرگومان دلخواهی هست

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
$sock = socket_create(AF_NET,SOCK_STREAM,SOL_TCP); // create a tcp stream socket

if(!socket_bind($sock,'127.0.0.1',8080)){ // Bind the source address
exit('ERROR');
}

if(!socket_connect($sock, '173.244.165.146', 80)) {// Connect to destination address
exit('ERROR');
}

socket_close($sock);

توجه داشته باشید که برای اتصال به IP و پورت مبدا ، مشخص کردن  IP و پورت مقصد ضروری نبوده و در کد بالا می‌توانید تابع socket_bind رو حذف کنید .
برای نوشتن بر روی پورت مقصد می‌توانید از تابع  socket_write استفاده کنید این تابع ۳ ارگومان ورودی دارد
 ارگومان اول :
متغییر نوع resource از خروجی تابع socket_create
آرگومان دوم :
اطلاعاتی که میخواهید روی سوکت بنویسید

۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
$sock = socket_create(AF_NET,SOCK_STREAM,SOL_TCP); // create a tcp stream socket
if(!socket_connect($sock, '173.244.165.146', 80)) {// Connect to destination address
exit('ERROR');
}

if(!socket_write($sock,'SalaM CheTori :D')) { // write to destination address
exit('ERROR');
}

socket_close($sock);

دو تابع socket_send و socket_sendto برای نوشتن بر روی سوکت وجود دارد که در ادامه مطالب توضیح میدم

2 Antworten auf شروع برنامه نویسی سوکت

  • رضا می گوید:

    خیلی عالی بود
    دستت درد نکنه
    کار منو راه انداختی
    فقط یک سوال:
    من یک دستگاه دارم که با پروتکل udp بر روی یک پورت خاص اطلاعات می فرستد(یعنی این میشود مبداء) که ما کاری با آن نداریم. من باید برنامه مقصد را بنویسم تا اطلاعات آمده از دستگاه را بخواند. حالا من باید socket_connect را کدام ip بگذارم؟
    اگر ممکن است راهنمایی فرمایید

  • admin می گوید:

    خواهش می‌کنم
    دستگاه مدار میکروکنترل شبکهَ‌س ؟
    تابع connect باید حاوی آدرس آی پی دستگاه مورد نظر باشه

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>