آموزش برنامه نویسی سوکت (socket)

سلام

شاید اولین نفری باشم که یک آموزش فارسی از سوکت نویسی در Php براتون نوشتم . این آموزش رو من مدتی قبل توی انجمن امنیتی آشیانه انتشار دادم و بعدش هم د ر Pc7 حالا بعدش از کجا سر در اورد باخبر نیستم🙂 .

امیدوارم برای اولین شروع کار مفید باشه .

خب اول یه مقدّمه روی کار باشه بد نیست …. سوکت ها اگر بخوام یه تعریف ساده بگم با مثال میتونم به سیستم چت اشاره کنم … یا ارتباط بین دو شبکه .
مثلا ما میتونیم یک سیستم چت درست کنیم که 2 طرف یا … با اتصال به یک آیپی و پورت با هم تبادل اطلاعات کنند .
یا میتونیم API برای سرویسی که برنامه نویسی کردیم درست کنیم . که سایت های دیگر اطلاعات را به آیپی و پورتی که سوکت تشکیل داده ارسال کنند و …
یا میتونیم توی کارای هک و … هم ازش استفاده کنیم

به طور کلی شما با توابع سوکت در php یک به یک آیپی و چورت کانکت میشید و هر سیستمی که به آن ip و port اتصال پیدا کند میتواند تبادل اطلاعات و دریافت داده را داشته باشد.

Part 1 – Server

ما برای IP & PORT نیاز به Listener و Reader + یکی که توی این داده ها بنویسه .
برای اینکار ما میایم دو فایل رو فرض میکنیم که یکی فایل در Server اجرا میشه و یکی در Client خب حالا فرض بر این داریم که
اسم فایل ها : server.php & client.php هستش حالا میخوایم باهم یک آموزش ساده رو پیش بریم با توضیحات :

(این کدها رو نمیتونید استفاده کنید چون باید در فایل سرور قسمت socket_read در یک while همیشه true قرار بگیرد تا دائم در حال چک کردن دریافتی ها باشد و سپس میتونید در یک فایل رایت کنید و بخونید در صفحه ای دیگر )

خب کد زیر رو در نظر بگیرید (مربوط به Server.php) :

کد PHP:
ignore_user_abort(true);
set_time_limit(0);

$host = «127.0.0.1»;
$port = 9898;

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die(«Could not create socket\n»);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, $host, $port);
socket_listen($socket);
$spawn  = socket_accept($socket);
$data   = socket_read($spawn, 10240) or die(«Could not read input\n»);

print $data;
socket_close($socket);

حالا تک تک خط ها رو براتون توضیح میدم … این کدها مربوط به ساخت و اتصال شدن به IP & PORT ای که اختصاص دادیم میباشد .
( شاید بپرسی IP & PORT باید چی باشه ! خب شما میتونید از آیپی و پورت هاست خودتون استفاده کنید ! جواب هم میده )

من اومدم اول از تابع ignore_user_abort استفاده کردم این تابع کارش اینه که صفحه اگر بسته هم شد توسط کاربر صفحه به کارش ادامه میدهد ( یعنی while که مقدارش را همیشه true دادیم تا زمانی که سرور خاموش یا down شود فعال است )

در خط بعد از set_time_limit استفاده کردم که چون هر لحظه در حال دریافت و ارسال است در مورد time limit مشکلی پیش نیاد که مقدارش را 0 دادیم .

– شاید این سوال براتون پیش بیاد که ممکن هستش مصرف CPU سرور رو بالا ببرید با اینکار … باید بگم اگر کد نویس حرفه ای باشید میتونید براحتی هدف خودتون رو در چند خط کنترل کرده و بدست بیارید . یعنی چند بایت تکرار تاثیری ندارد در کاره cpu سرور و …

خب در پایین 2 متغیر تعریف کردیم یکی host که همان IP ما میباشد و یکی PORT که پیشنهاد میکنم پورت بالا 8000 یا 7000 بکار ببرید

اندکی پایینتر به SOCKET_CREATE میرسیم که همان مقدار Domain این تابع آماده سازی شده برای ساخت سوکت . خب بریم سره تنظیمات این تابع . ما اومدیم اول براش AF_INET تعریف کردیم خب این مربوط به نوع آیپی یا بهتر بگم نوع خانواده آیپی هستش که سه نوع امکان تعریف دارد :

AF_INET : IPv4
AF_INET6 : IPv6
AF_UNIX : IPC

مقدار بعدی این تابع SOCKET_STREAM میباشد که همان TYPE این تابع است که شامل 5 نوع است :

SOCK_STREAM : اطلاعات مبتنی برا بایت .
SOCKET_DGRAM : برای UDP Protocol

و … که میتوانید در آدرس زیر اطلاعات آنرا مشاهده کنید :

تنظیم بعدی مربوط به نوع پروتکل هستش که استفاده میکنیم :

icmp
udp
tcp

که خب ما توی کارمون فعلا از TCP استفاده میکنیم .(بستگی به نوع مصرفمون داره) که ما مقدار 0 دادیم .
خب تابع بعدی socket_set_option است که مربوط به تنظیمات سوکت میباشد .
در داده اول باید متغیر SOCKET_CREATE خودمان را معرفی کنیم . در قسمت دوم LEVEL و در قسمت سوم و چهارم OptName و Optval را مشخص کنیم

خب حالا میرسیم به SOCKET_Bind که یه جورایی کاره آماده سازی پروت و آیپی رو داره که وقتی اجرا بشه آنها هم آماده به کار میشوند و آماده مصرف .
(در واقع همان اطلاعات متصل شدن به پورت و آیپی است)

قسمت بعدی از تابع LISTEN استفاده کردیم که کارش گوش کردن چیزهایی هست که ارسال میشود .
قسمت بعد نیز ما سوکت رو accept میکنیم تا برای read آماده باشد .
در انتها نیز read میکنیم و پرینت
فقط این نکته رو فراموش نکنید این کدی که در بالا قرار دادم جنبه آموزشی داره برای استفاده باید socket_accept & socket_read در یک while برابر true قرار گیرد.

شما کافی است فایل سرور را یکبار در سرور خود اجرا کنید و پس از مدتی ببندید فایل خودش آماده به گوش کردن اطلاعات و انجام تغییرات میشود .

* نکته : سرور همیشه باید در حال اجرای همیشگی باشد تا client بتواند اطلاعات ردّ و بدل کند یعنی نمیتوانید قبل از انجام کار client فایل server را باز کنید خیر . زیرا این سرور در این حالت اجرا میشود و بسته و اگر هم while مقدار true داشته باشد که دیگه به client کار نمیکشه .

با تشکر//
BY CarBoN.08 (شناسه کاربری من در آشیانه)

Part 2 – Client

سلام دوباره ,

خب حالا باید بریم سره قسمت client.php یعنی جایی که با کاربر ارتباط مستقیم داره و یک رابط بین نیاز کاربر و ارسال اون نیاز به سرور هستش .
کد نمونه : (Client.php)

کد PHP:
set_time_limit(0);$host = «127.0.0.1»;
$port = 9898;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die(«Could not create socket\n»);
$connect = socket_connect($socket, $host, $port);

$sendmsg = «Hi Ashiyane»;
socket_write($socket, $sendmsg,strlen($sendmsg));

socket_close($socket);

خب در مورد تابع اولی یعنی set_time_limit که توضیح دادیم .
راجع به این دو متقیر host و port هم توضیح دادیم (که باید مقدارش با مقدار وارد شده در سرور برابری کند)

طبق روال اول باید از SOCKET_CREATE استفاده کنیم تا بتونیم پایه ی کار رو آماده سازی کنیم . سپس در خط بعد از SOCKET_CONNECT
استفاده کردیم که داره به سوکتی که در سرور ساختیم اتصال پیدا میکنه . که شامل متغیر های مربوطه هم هست که متوجه اون هستید .

بعدش میمونه SOCKET_WRITE خب اینجا ما داریم یک سری داده ها رو در اون ip و port یا به طور کلی سوکتمون مینویسیم که در پشت پرده سرور که فایلش
در حال اجرا هستش داره میخونه و طبق دستور و قوانین از پیش تعیین شده داره اعمال مورد نظر مارو انجام میده .

خب این هم در واقع یه جور مقدمه برای سوکت بود . آموزش بعدی نوشتن یک سیستم چت ساده هستش با استفاده از سوکت و …
در آموزش های بعدی تعداد Client های متصل شده به سوکت و امنیت بیشتر در سوکتهامون رو یاد میدم

By CarBoN.08

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: