در این قسمت فرض شده شما با برنامه نویسی پی اچ پی آشنایی داشته و روش اجرای برنامه های پی اچ پی را می دانید. در غیر اینصورت از بخش آموزش برنامه نویسی php استفاده کنید.
ایجاد یک سوکت
این اولین کاری که باید انجام دهیم ایجاد سوکت است. تابع socket_create این کار را انجام می دهد.
نمونه کد آن بصورت زیر است:
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
تابع socket_create یک سوکت ایجاد می کند و یک توصیفگر سوکت را می دهد که می تواند در سایر دستورات شبکه استفاده شود.
کد بالا یک سوکت با خواص زیر ایجاد می کند …
Address Family : AF_INET (this is IP version 4)
Type : SOCK_STREAM (this means connection oriented TCP protocol)
Protocol : 0 [ or IPPROTO_IP This is IP protocol]
مدیریت خطا
اگر هر یک از توابع سوکت خراب شود، اطلاعات خطا را می توان با استفاده از توابع socket_last_error و socket_strerror بازیابی کرد.
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created";
خوب، پس شما یک سوکت با موفقیت ایجاد کرده اید. اما بعد چه؟ بعدا سعی خواهیم کرد که با استفاده از این سوکت به برخی از سرورها متصل شویم. ما می توانیم به www.google.com متصل شویم
توجه داشته باشید
به غیر از SOCK_STREAM نوع سوکت نوع دیگری به نام SOCK_DGRAM وجود دارد که نشان دهنده پروتکل UDP است. این نوع سوکت سوکت غیر اتصال است. در این آموزش ما باید به SOCK_STREAM یا TCP سوکت وصل شویم.
سوکت های دیگر مانند UDP، ICMP، ARP اصطلاح “اتصال” ندارند. این ارتباطات غیر ارتباطی است. این بدان معنی است که شما را از هر کس و هر کسی می فرستد یا دریافت می کند.
ارسال داده ها
تابع send به سادگی داده ها را ارسال می کند. این تابع به توصیفگر سوکت، داده ها برای ارسال و اندازه آن نیاز دارد.
قطعه کد زیر یک مثال بسیار ساده از ارسال برخی از داده ها به آی پی سایت google.com است:
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
//Connect socket to remote server
if(!socket_connect($sock , '74.125.235.20' , 80))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not connect: [$errorcode] $errormsg \n");
}
echo "Connection established \n";
$message = "GET / HTTP/1.1\r\n\r\n";
//Send the message to the server
if( ! socket_send ( $sock , $message , strlen($message) , 0))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not send data: [$errorcode] $errormsg \n");
}
echo "Message send successfully \n";
در مثال بالا، ابتدا به یک آدرس IP متصل می شویم و سپس رشته “GET / HTTP / 1.1 \ r \ n \ r \ n” را به آن ارسال می کنیم.
این پیام در واقع یک دستور HTTP است تا صفحه اصلی وب سایت را دریافت کند.
حالا که برخی از داده ها را ارسال می کنیم، زمان آن برای دریافت پاسخ از سرور است.
توجه داشته باشید
هنگام ارسال اطلاعات به سوکت، شما اساسا اطلاعات را به آن سوکت نوشتید. این شبیه نوشتن داده ها در یک فایل است.پس می توانید از تابع نوشتن برای ارسال اطلاعات به سوکت استفاده کنید. بعدا در این آموزش از تابع نوشتن برای ارسال داده استفاده خواهیم کرد.
دریافت اطلاعات
تابع Recv برای دریافت اطلاعات در یک سوکت استفاده می شود. در مثال زیر ما باید همان پیام را به عنوان مثال آخر ارسال کنیم و یک پاسخ از سرور دریافت کنیم.
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created \n";
//Connect socket to remote server
if(!socket_connect($sock , '74.125.235.20' , 80))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not connect: [$errorcode] $errormsg \n");
}
echo "Connection established \n";
$message = "GET / HTTP/1.1\r\n\r\n";
//Send the message to the server
if( ! socket_send ( $sock , $message , strlen($message) , 0))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not send data: [$errorcode] $errormsg \n");
}
echo "Message send successfully \n";
//Now receive reply from server
if(socket_recv ( $sock , $buf , 2045 , MSG_WAITALL ) === FALSE)
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not receive data: [$errorcode] $errormsg \n");
}
//print the received message
echo $buf;
خروجی کد بالا بصورت زیر است:
$ php /var/www/socket.php
Socket created
Connection established
Message send successfully
HTTP/1.1 302 Found
Location: http://www.google.co.in/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=www.google.com
Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.www.google.com
Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=google.com
Set-Cookie: expires=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
Set-Cookie: path=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
Set-Cookie: domain=; expires=Mon, 01-Jan-1990 00:00:00 GMT; path=/; domain=.google.com
Set-Cookie: PREF=ID=3c2e53ffcc387bbb:FF=0:TM=1342766363:LM=1342766364:S=DTuSOuahFqyd6vjp; expires=Sun, 20-Jul-2014 06:39:24 GMT; path=/; domain=.google.com
Set-Cookie: NID=62=HZWk5tBSunVEofFri475wbeCNiChGf_bs7Pz_Z32hfm-B-0M4JRhz-pptjtChOk6lVepLBhOtB2pNHCT5DynobfZaGQaPS5Dh9Rq4YAqt40hExsePHEyA0ECMKjq5KeE; expires=Sat, 19-Jan-2013 06:39:24 GMT; path=/; domain=.google.com; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Date: Fri, 20 Jul 2012 06:39:24 GMT
Server: gws
Content-Length: 221
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
302 Moved <h1>302 Moved</h1>
The document has moved
<a href="http://www.google.co.in/">here</a>.
می توانیم ببینیم کدام پاسخ توسط سرور ارسال شده است. نتیجه به نظر می رسد چیزی شبیه اچ تی ام ال است. Google.com با محتوای صفحه، درخواست ما را پاسخ داده است که کاملا ساده است.
حالا که پاسخ را دریافت کردیم، وقت آن است که سوکت را ببندیم.
بستن سوکت
تابع socket_close برای بستن سوکت استفاده می شود.
socket_close($sock);
بنابراین در مثال بالایاد گرفتید که چگونه:
1. یک سوکت ایجاد کنید
2. به سرور راه دور وصل شوید
3. برخی از داده ها را ارسال کنید
4. یک پاسخ دریافت کنید
جالب است که بدانید مرورگر وب شما همان کار را در هنگام باز کردن www.google.com انجام می دهد
این نوع فعالیت سوکت نشان دهنده کلاینت است. یک کلاینت یک سیستم است که به یک سیستم از راه دور متصل می شود تا داده ها را بیرون بیاورد.
نوع دیگری از فعالیت سوکت SERVER نامیده می شود. سرور یک سیستم است که از سوکت برای دریافت اتصالات ورودی استفاده می کند و داده ها را با آنها فراهم می کند. این فقط بر خلاف کلاینت است. بنابراین www.google.com سرور است و مرورگر شما یک کلاینت است. یا از نظر فنی www.google.com یک HTTP Server است و مرورگر وب شما یک سرویس گیرنده HTTP است.
الان وقت آن است تا برخی از وظایف سرور را یادبگیرید که با استفاده از سوکت انجام شود. در بخش بعدی وظایف سرور در برنامه نویسی سوکت ها با php را آموزش خواهیم داد.