توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آموزش برنامه نویسی سوکت (socket)
CarBoN.08
05-29-2010, 11:12 AM
سلام
این تاپیک رو ایجاد کردم تا آموزشها مربوط به سوکت + مثال قرار بدم .
منتظر آموزش ها باشید. :d;;)
خب اول یه مقدّمه روی کار باشه بد نیست .... سوکت ها اگر بخوام یه تعریف ساده بگم با مثال میتونم به سیستم چت اشاره کنم ... یا ارتباط بین دو شبکه .
مثلا ما میتونیم یک سیستم چت درست کنیم که 2 طرف یا ... با اتصال به یک آیپی و پورت با هم تبادل اطلاعات کنند .
یا میتونیم API برای سرویسی که برنامه نویسی کردیم درست کنیم . که سایت های دیگر اطلاعات را به آیپی و پورتی که سوکت تشکیل داده ارسال کنند و ...
یا میتونیم توی کارای هک و ... هم ازش استفاده کنیم
به طور کلی شما با توابع سوکت در php یک به یک آیپی و چورت کانکت میشید و هر سیستمی که به آن ip و port اتصال پیدا کند میتواند تبادل اطلاعات و دریافت داده را داشته باشد.
یه مقدمه سه خطی توضیح دادم تا من آموزش ها رو آماده کنم و بنویسم و تا شب براتون قرار بدم :)
CarBoN.08
05-29-2010, 12:49 PM
سلام
ما برای IP & PORT نیاز به Listener و Reader + یکی که توی این داده ها بنویسه .
برای اینکار ما میایم دو فایل رو فرض میکنیم که یکی فایل در Server اجرا میشه و یکی در Client خب حالا فرض بر این داریم که
اسم فایل ها : server.php & client.php هستش حالا میخوایم باهم یک آموزش ساده رو پیش بریم با توضیحات :
(این کدها رو نمیتونید استفاده کنید چون باید در فایل سرور قسمت socket_read در یک while همیشه true قرار بگیرد تا دائم در حال چک کردن دریافتی ها باشد و سپس میتونید در یک فایل رایت کنید و بخونید در صفحه ای دیگر )
خب کد زیر رو در نظر بگیرید (مربوط به Server.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
و ... که میتوانید در آدرس زیر اطلاعات آنرا مشاهده کنید :
[Only registered and activated users can see links]
تنظیم بعدی مربوط به نوع پروتکل هستش که استفاده میکنیم :
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
thumbsupheart
آموزش Client هم تا شب قرار میدم :)
CarBoN.08
05-29-2010, 11:27 PM
سلام دوباره ,heart
خب حالا باید بریم سره قسمت client.php یعنی جایی که با کاربر ارتباط مستقیم داره و یک رابط بین نیاز کاربر و ارسال اون نیاز به سرور هستش .
کد نمونه : (Client.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
thumbsup:x
با تشکر//
CarBoN.08
05-31-2010, 12:18 PM
سلام :D
خب قرار شده بود که مثال بزنم در رابطه با سیستم های چت ولی پشیمون شدم ... چون فعلا به نظرم زود هستش بهتره جلوتر بریم با مسائل امنیتی آشنایی کافی پیدا کنیم و مثال ها پیچیده تر بزنیم ... heart
واسه همین اول اومدم یک مثال ساده و آماده برای server و client بزنم ... البته چون فقط هدف این مثال درک بهتر کار هستش بهتون پیشنهاد میکنم فقط برای یادگیری ازش استفاده کنید چون هیچجوره امنیت نداره ! {در رابطه با امنیت در آموزش های بعدی مفصل صحبت میکنم}
شما اول باید فایل های server.php & client.php & test.txt را آماده کنید . ببینید اول کامت های فایل رو بخونید که نکته گفتم توش ;) مسئله بعدی بر میگرده به درک شما از این کار ... شاید بعد از اجرا و گرفتن نتیجه به خودتون بگید خب چه کاریه اینو که با چند خط دستور ساده میشد انجام داد ...
خب ببینید اوایل اینطور هستش و این حرف رو میزنید و مثلا شما یک سایتی به نام dom1.com دارید و یک سایت دیگر به نام dom2.com خب حالا سایت dom1.com یک سایتی هستش که اطلاعات ثبت میکنه (بگیم مثل توییتر) حالا شما بخواین یه سیستم جدا برای خودتون بنویسید که از dom2.com به dom1 بتونید اطلاعات ارسال کنید . بدون اینکه آثاری از dom1.com وجود داشته باشه خب به راحتی میتونید از این روش استفاده کنید یا Cback که همگی آشنایی لازم رو دارید :دی که با nc میومدیم IP خودمون رو با یک پورت تعریف شده آماده گوش کردن میکردیم بعدش توی مکان دیگه با فایل pl که داشتیم میومدیم به اون آیپی وصل میشدیم ...(حالا اون دستورات از قبل مشخص داشت که تعریف شده براش)
و ... که بخوام بگم خیلی طول میکشه ...
server.php
<?php
ignore_user_abort(true);
set_time_limit(0);
// yekbar bayad file server.php run beshe :-)
// In faghat janbeye amoozeshi dare besoorate kham hastesh
// agar ghasde estefade darid ta akhare amoozesh ha sabr konid
// chon in hai ke alan daram migam hich amniati nadare :-)
// sabr dashte bashid ta be masaele amniati ham beresim
// ye bahse mofasal rajebesh baraton mikonam
//
// C.08
$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);
while(true){
$spawn = socket_accept($socket);
$data = socket_read($spawn, 10240) or die("Could not read input\n");
$load = file_get_contents('test.txt'); // inja mikhastam ba func file_ kar konam chon badan bahash kar ziad darim
file_put_contents('./test.txt',$load.$data); // vase hamin khater az write va ... estefade nakardam ;)
// shoma inja mitonid dastoorati ke mikhayn ro ejra konid masalan mitoni begid agar write ma
// barabare [1] bood felan karo anjam bede ya masalan 1^2^send^hi bood ba tajzie o tahlil
// dastoorate khodemono ejra konim :-)
}
socket_close($socket);
?>
client.php :
<?php
set_time_limit(0);
// harchi ke lazemeye comment kardan bood toye server.php goftam :-)
$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"; // hala mitonid be raveshe khodeton data ro daryaft konid !! harjoor... :-)
socket_write($socket, $sendmsg,strlen($sendmsg));
socket_close($socket);
// inja ham hala hadafe khodetono bade anjame kari ke kardid mitonid print ya ... konid.
// Exmp:
print file_get_contents('test.txt');
?>
+ test.txt
By CarBoN.08
thumbsupheart
تشکر//
CarBoN.08
05-31-2010, 06:55 PM
سلام به دوستان , heart
خب الان اومدم اندکی پایه ریزی مسائل امنیتی رو داشته باشم و مقدمه رو آماده کنم چون از این به بعد مثال هایی که میزنم سعی میکنم امنیت رو درون کدهام
رعایت کنم .
خب ببینید بحث الان سره این مسئله هستش که client میدونه داره برای چی به server متصل میشه . مثلا میگه برای انتقال اطلاعات خب مشکل هم همینجاست
این اطلاعات آیا اطلاعات خاصی هستند؟ یا خیر؟ اگر کمی فکر کنیم متوجه میشیم که توی مثال ساده قبلی من شما میتونید به راحتی shell یا ... وارد سرور کنید .
(حالا کاری نداریم پسوند فایل .txt بود) یا در پروژه هایی که از دیتابیس استفاده میشه اونجا خرابکاری کنیم ...
خب بحث همین هستش یعنی به طوری کلی ما باید برای طراحی چنین سیستمی اول هدف ارتباط server و client رو مشخص کنیم . بهترین راه امنیت سازی همینی هست که گفتم . باید هدف رو از قبل مشخص کنیم .
شاید بپرسید خب چرا میگم هدف باید مشخص باشه یا یعنی چی؟
ما هیچ موقع از سوکت برای ردّ و بدل کردن اطلاعات آزاد استفاده نمیکنیم و همیشه باید دستورات و کدهای محدودی رو برای سوکت و مخصوصا بهینه سازی در عملکرد
آن قرار بدیم . بر فرض مثال اطلاعات مستقیم وارد نکنیم یعنی نگیم به سرور که SOCKET_READ هرچی بدست اومد همون رو عملکرد کن . نباید اینطور باشه جدا از
فیلترهایی که روی کار صورت میگیره . باید دستورات از قبل تعیین کنیم و بگیم که سرور اگر اطلاعاتی که READ کردی چیزی بود که ما میخواستیم دستور مخصوص اون رو
اجرا کن .
ارسال : [1] => عملکرد سرور : نمایش فایل ها موجود در درایو سرور !
ارسال : [2] + نام فایل => عملکرد سرور : حذف فایل مورد نظر .
خب حالا اگر ما میومدیم تعریف میکردیم :
ارسال : $var => عملکرد سرور : func($var);
ارسال : $var => عملکرد سرور : func($var);
اینجا ما هیچ محدودیتی به وجود نیاوردیم به قولی یک راهی رو مشخص کردیم که انتهایی نداره ! حالا کاربر میتونه دستور مخرب یا هرچیز دیگر رو وارد READ و ... سرور
کند و هرکاری که مورد هدفش هست را اجرا کند و در عمل سوکت اختلال ایجاد کنه .
* به طور کلی همیشه سعی کنید برای اجرای یک سوکت هدف و ... را از قبل مشخص کنید . یعنی ایجاد محدودیت داشته باشید . cigar
* در مثال های بعدی کارم رو بر پایه امنیت پیش میبرم که یه عادت هم بشه و درکش هم راحتتر ...
By CarBoN.08
heartthumbsup
تشکر//
amir00
08-02-2010, 09:07 PM
برای سوکت های کلاینت میتونید از تابع fsockopen() استفاده کنید که خیلی راحت تر هست.
این تابع یک اشاره گر فایل برمیگردونه که با توابع فایل به راحتی میتونیم ازش استفاده کنیم
$fp = fsockopen(IP , PORT);
fread($fp,....)
fwrite
fget
fgetc
fgets
fgetss
,....
CarBoN.08
08-07-2010, 11:21 AM
سلام
درسته ولی بعدا واسه کارهایی که میخوایم کنیم جواب نمیده :53:
mardani67
03-30-2011, 08:28 AM
سلام
من میخوام از طریق سوکت پروگرامینگ یه تابع توی وب سرویس رو اجرا کنم اینجوری که توی اون تابع مثلا دو تا عدد جمع میشه و وقتی صفحه ای که توش سوکت نوشتیم رو باز میکنیم نتیجه جمع رو نشون بده:69::69::69:
vBulletin® v3.8.4, Copyright ©2000-2012, Jelsoft Enterprises Ltd.