PDA

View Full Version : سوال: یک نمونه ساده کار با سوکت پروگرمینگ



abolfazl-z
پنج شنبه 26 اردیبهشت 1392, 10:11 صبح
سلام دوستان :لبخندساده:
دوستان من درست کار سوکت رو نفهمیدم !

مثلا اون کد هایی که با سرور می نویسیم (server.php) باید بهش چیزی ارسال بشه و یا باید چی بشه و یا باید یکبار اجرا بشه ....

پس کلاینت چکار می کنه این وسط !

کلا نمیدونم چی به چیه :عصبانی++:

--------------------------------------------------------------------------
دوستان اگر میتونید یک مثال ساده همراه با توضیح ضمیمه کنید تا بنده روی لوکال هاست تست کنم.

با تشکر

abolfazl-z
پنج شنبه 26 اردیبهشت 1392, 17:37 عصر
دوستان کسی کمکی نمی کنه.😨

SilverLearn
پنج شنبه 26 اردیبهشت 1392, 19:14 عصر
عنوان کتاب: کتاب اکسپلویتینگ و سوکت نویسی با زبان PHP (http://aghazeh.com/ebooks-programing-web/626--socket-programming-and-exploiting-with-php.html) به زبان فارسی
نویسنده: شهریار جلایری
زبان کتاب: فارسی
تعداد صفحه: 32
حجم فایل: 418 کیلوبایت


قابل توجه کاربران شما می توانید این کتاب را یکجا و بطور کامل از لینک زیر دریافت کنید.
لینک مستقیم

http://aghazeh.com/images/stories/ccnewsletter/ico-download-thumb-240x240-1262.gifبرای دریافت فایل اینجا کلیک کنید (http://dll-aghazeh.com/web%20programing%20language/FA%20-%20Socket%20Programming%20and%20Exploiting%20with% 20PHP%20www.aghazeh.com.zip). (لینک مستقیم)

پسورد فایل: www.aghazeh.com (http://www.aghazeh.com/)

eshpilen
پنج شنبه 26 اردیبهشت 1392, 19:19 عصر
مثال که توی منوال هست.
شما میخوای با سوکت چکار کنی؟
سرور سوکت گوش میکنه روی یک پورت خاصی، بعد شما میتونی با یک کلاینت سوکتی به اون وصل بشی و بین سرور و کلاینت میتونه هرچیزی رد و بدل بشه.
همینطوریش ارتباط سوکتی کار خاصی انجام نمیده؛ این شما هستی که تعیین میکنی چه اطلاعاتی چطور و در چه فرمتی رد و بدل بشن و سرور و کلاینت انتظار چه اطلاعاتی رو داشته باشن و چطور تفسیر بکنن (و به این مجموعه قواعد اگر بقدر کافی گسترده و کلی/انعطاف پذیر و دقیق باشه «پروتکل» گفته میشه).
مثلا میتونی در برنامهء سرور تعیین کنی که اگر کلاینت کلمهء hello رو ارسال کرد، سرور عبارت hi, how are u رو به کلاینت ارسال کنه. در سمت کلاینت هم باز خود کلاینت هست که شما درش تعیین کردید با این اطلاعات دریافت شده چکار کنه.

abolfazl-z
پنج شنبه 26 اردیبهشت 1392, 22:32 عصر
عنوان کتاب: کتاب اکسپلویتینگ و سوکت نویسی با زبان PHP (http://aghazeh.com/ebooks-programing-web/626--socket-programming-and-exploiting-with-php.html) به زبان فارسیمن این کتاب رو خوندم!


سرور سوکت گوش میکنه روی یک پورت خاصی، بعد شما میتونی با یک کلاینت سوکتی به اون وصل بشی و بین سرور و کلاینت میتونه هرچیزی رد و بدل بشه.همین من رو گیج کرده! مگر سرور روی هاست نیست و باید یکبار اجرا بشه (خوب اجرای این صفحه محدود هست و توسط ما در هنگام بستن صفحه به پایان میرسه !یعنی باید یکبار اجرا بشه؟)

و


، سرور عبارت hi, how are u رو به کلاینت ارسال کنهوقتی از پورتی چیزی دریافت کرد و عملیات را انجام داد مگر کار اون صفحه به پایان نمیرسه ؟(اجرایش به پایان نمیرسه)

دوستان شاید یکم درکش برام سخته ولی من با مثال بهتر متوجه می شوم.

اگر میشود برای مثال یک برنامه ای درست کنید(ساده خیلی ساده) که بشه اطلاعاتی رو رد و بدل کرد!(بین دو صفحه)

eshpilen
پنج شنبه 26 اردیبهشت 1392, 23:48 عصر
مگر سرور روی هاست نیست و باید یکبار اجرا بشه (خوب اجرای این صفحه محدود هست و توسط ما در هنگام بستن صفحه به پایان میرسه !یعنی باید یکبار اجرا بشه؟)
لزوما با بسته شدن صفحه، اجرای برنامه در سمت سرور متوقف نمیشه. اینکه بشه یا نشه دست تنظیماته که توسط خود برنامه هم از طریق توابع مربوطه قابل تعیین شدنه.
ضمنا استارت برنامه های سرور لزوما از طریق مرورگر نیست. میشه از طرق دیگری مثل خط فرمان هم اجرا کرد.


وقتی از پورتی چیزی دریافت کرد و عملیات را انجام داد مگر کار اون صفحه به پایان نمیرسه ؟(اجرایش به پایان نمیرسه)
نه دیگه تموم نمیشه لزوما.
معمولا برنامه های سوکتی داخل یک loop بی پایان مدام عملیات رو تکرار میکنن و منتظر میمونن تا اتصال و ارتباط بعدی توسط کلاینت ها.

abolfazl-z
جمعه 27 اردیبهشت 1392, 00:04 صبح
مرسی.
ولی سوالات ام زیاد هست که هر کدوم زمینه ساز سوال بعدی می باشد.
هنگامی که برنامه به خط socket_listen() میرسد ایست می کند ؟ و یا نه ما باید در این خط از حلقه نامحدود استفاده کنیم ؟

eshpilen
جمعه 27 اردیبهشت 1392, 00:29 صبح
خیر socket_listen اجرا میشه و اجرای برنامه به خط بعدی میره. توقف نمیکنه ولی نیازی به loop هم نیست. این دستور کافیه یک بار اجرا بشه.

ولی وقتی به socket_accept برسه منتظر میشه تا یک کلاینت متصل بشه؛ وقتی کلاینت متصل شد میره به خط بعد.
وقتی socket_accept اجرا میشه/کلاینتی متصل میشه، یک سوکت دیگه بوسیله این تابع برگشت داده میشه که بوسیلهء اون با کلاینت ارتباط برقرار میکنیم.
loop رو برای socket_accept استفاده میکنیم که وقتی یک کلاینت قطع شد، دوباره socket_accept اجرا بشه و برنامه پشتش برای اتصال کلاینت بعدی (یا اتصال مجدد همون کلاینت) منتظر بمونه.

البته یک loop هم داریم برای ارتباط دو طرفه با کلاینت. یعنی توی این حلقه پیغام کلاینت رو میخونیم (socket_read)، بعد میتونیم با socket_write پیامی رو در پاسخ بهش بفرستیم، و این فرایند میتونه بطور نامحدود در یک حلقه تکرار بشه. البته معمولا ارتباط نامحدود نیست و بعد از دریافت و ارسال معینی یا با شرط خاصی از حلقه خارج میشه و ارتباط با کلاینت قطع میشه (سوکتی رو که socket_accept برگشت داده بود و ازش برای ارتباط با کلاینت استفاده کرده بودیم با socket_close میبندیم) و بعد میتونیم دوباره در حلقهء خارجی تابع socket_accept رو اجرا کنیم و منتظر اتصال بعدی بمونیم.

بطور مثال این کد رو از منوال کپی کردم و البته کمی دستکاریش کردم تا جمع و جورتر و ساده تر بشه:


<?php

error_reporting(E_ALL);
ini_set('display_errors', '1');

set_time_limit(0);
ignore_user_abort(true);

ob_implicit_flush();

$address='127.0.0.1';
$port = 10000;

if(($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) exit("socket_create() failed!");

if(socket_bind($sock, $address, $port) === false) exit("socket_bind() failed!");

if(socket_listen($sock, 5) === false) exit("socket_listen() failed!");

do {
if(($msgsock = socket_accept($sock)) === false) exit("socket_accept() failed!");

socket_write($msgsock, 'Hi!');

do {
if(false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) exit("socket_read() failed!");

if (!$buf = trim($buf)) {
continue;
}

if ($buf == 'quit') break;

if ($buf == 'shutdown') {
socket_close($msgsock);
break 2;
}

$talkback = "PHP: You said '$buf'.\n";
socket_write($msgsock, $talkback);

echo "$buf\n";

} while (true);

socket_close($msgsock);

} while (true);

socket_close($sock);

?>

چیزهایی که گفتم رو توش میتونید ببینید.

این رو در لوکال با مرورگر اجرا کنید مرورگر بطور نامحدود منتظر میمونه و حتی با بستن مرورگر هم متوقف نمیشه.

شما میتونید با telnet در ویندوز بهش وصل بشید.
در خط فرمان تایپ کنید telnet. بعد در خط فرمان telnet که ظاهر میشه تایپ کنید open 127.0.0.1 10000
بعد میبینید که پیام سرور سوکت دریافت میشه که میگه Hi
بعد هرچی شما تایپ کنید و اینتر بزنید، توسط سرور برگشت داده میشه به این شکل: PHP: You said 'test'.
اگر تایپ کنید quit، ارتباط فعلی با کلاینت (telnet) قطع میشه (و میتونید دوباره توسط open 127.0.0.1 10000 بهش وصل بشید).
اگر تایپ کنید shutdown، اجرای برنامهء سرور سوکت بطور کامل متوقف میشه.

abolfazl-z
جمعه 27 اردیبهشت 1392, 00:39 صبح
واقعا ممنونم :X (کلا گرفتم)

ولی باز هم چند تا سوال ؟

1. اگر کسی حالا به هر نحوی بصورت مستقیم وارد این صفحه(سرور) بشه مشکلی پیش نمیاد ؟

2. آیا دو کاربر یا بیشتر همزمان می تونند وارد بشن و پاسخ دریافت کنن؟

3. آیا از نظر هک مشکلی وجود ندارد (سوکت باز بماند)؟

4. اگر جواب سوال دوم مان درست باشد پس محدود کردن کاربران دست خودمان هست؟

5. سرعت چطور هست؟

eshpilen
جمعه 27 اردیبهشت 1392, 01:19 صبح
1. اگر کسی حالا به هر نحوی بصورت مستقیم وارد این صفحه(سرور) بشه مشکلی پیش نمیاد؟
خب مثل صفحات و اطلاعات و عملیات عادی وب که مثلا مربوط به ادمینه و دیگران نباید بتونن بهش دسترسی داشته باشن، باید دسترسی به برنامهء سرور رو هم به یک طریقی محدود کنی دیگه. مثلا براش پسورد بذاری.
ضمنا احتمالا باید یه مکانیزمی هم بذاری که خودت هم اشتباهی برنامهء سرور رو بیش از یک بار اجرا نکنی. چون حداقلش میتونه این باشه که چند برنامه بطور همزمان درحال اجرا بمونن و منابع سخت افزاری رو هدر بدن. در حالتهای دیگه ممکنه مشکلات بیشتر و مشکلات امنیتی بوجود بیان.



2. آیا دو کاربر یا بیشتر همزمان می تونند وارد بشن و پاسخ دریافت کنن؟
خودت میتونستی اینو تست کنی.
الان در این برنامهء ما، اگر وقتی یک کلاینت telnet وصله، یک command prompt دیگه باز کنی و بخوای با telnet به سرور وصل بشی، وصل نمیشه. و اگر کلاینت متصل شده قبلی quit کنه اونوقت اون یکی میتونه وصل بشه.
البته دلیلش اینه که برنامهء سرور ما با این توانایی نوشته نشده.
مثلا اگر برنامهء سرور رو مالتی ترد کنیم اونوقت میتونه وقتی داره با یک کلاینت صحبت میکنه (در یک ترد مجزا)، بازم socket_accept رو اجرا کنه و کلاینت های دیگری هم همزمان بهش وصل بشن.
نکته اینه که هر کلاینتی که وصل میشه باید برای صحبت باهاش یک ترد جداگانه ایجاد کرد. به این شکل loop خارجی برنامه منتظر قطع ارتباط با کلاینت نمیمونه.
البته در PHP چون امکانات مالتی ترد نداره این کار به این راحتی نیست و باید دید چطور میشه مالتی ترد رو پیاده سازی یا شبیه سازی کرد.



3. آیا از نظر هک مشکلی وجود ندارد (سوکت باز بماند)؟
منظورت اینه که برنامهء سرور در حال اجرا باقی بمونه؟
خب خطر امنیتیش دیگه بستگی به برنامهء خودت داره که چه اطلاعاتی رو چطوری بگیره و بده و چه عملیاتی بر چه اساسی انجام بده.
مثل هر برنامهء دیگری برنامهء شما هم میتونه هزار و یک جور ضعف و حفرهء امنیتی داشته باشه و در معرض حمله های گوناگونی است.


4. اگر جواب سوال دوم مان درست باشد پس محدود کردن کاربران دست خودمان هست؟
برای پاسخگویی همزمان به چند کاربر، برنامه باید مالتی ترد باشه یا بهرصورت دیگری این قابلیت رو درش شبیه سازی کنیم. تعداد کاربران همزمان رو هم میشه محدود کرد.


5. سرعت چطور هست؟
یعنی چی؟
سرعت رو باید گفت برای چه کاری تحت چه شرایطی میخواید.
نه اینکه سرعت چطوره!

abolfazl-z
جمعه 27 اردیبهشت 1392, 10:02 صبح
یعنی چی؟
سرعت رو باید گفت برای چه کاری تحت چه شرایطی میخواید.
نه اینکه سرعت چطوره!

نگاه کنید من می خواستم سوکت پروگرمینگ رو یاد بگیرم تا ضعفی تو کارام نباشه ولی اینطور که دیدم کار با هاش راحته ولی محدودیت ها و خطراتی(حالا چون با سوکت پروگرمینگ زیاد کار نکردم که) دارد.

مثلا برای یک سیستم چت آنلاین میشه از اش استفاده کرد ولی ما بیاییم با برنامه نویسی(نه با SQL) تحت کار با فایل ها این عملیات را انجام دهیم خوب نیست ؟

برای همین برای من سرعت و منابع سخت افزاری (بهینه سازی) مهم هست.

و همچنین چه استفاده هایی مفید دیگری میشه از سوکت پروگرمینگ کرد که نمیشه این کار ها رو با خود برنامه نویسی(یعنی همین دریافت و ذخیره و ...) انجام داد؟

eshpilen
جمعه 27 اردیبهشت 1392, 20:32 عصر
مثلا برای یک سیستم چت آنلاین میشه از اش استفاده کرد ولی ما بیاییم با برنامه نویسی(نه با SQL) تحت کار با فایل ها این عملیات را انجام دهیم خوب نیست ؟

دقیقا متوجه نشدم منظورت چیه.
ولی ظاهرا میگی واسه چت از سوکت استفاده کنی خوبه یا نه؟

بنده نمیدونم چت شما چه مقیاسی داره و قراره از روز اول چه ترافیکی داشته باشه که بنظرت کم میاره.
فکر کنم این باید در عمل و بصورت تجربی مشخص بشه.
ضمنا سوکت هم که لزوما معجزه نمیکنه. شاید اونقدری هم که فکر میکنید تاثیر بزرگی نداشته باشه.
در درجهء اول فکر کنم قدرت خود سرور و منابع سخت افزاری باید تناسب کافی داشته باشن با نوع کاربرد و میزان ترافیک.

چت تحت وب از طریق مرورگر مد نظرته دیگه؟

فکر میکنم یکسری مشکلاتی در این راه باشه.
یکیش اینکه فکر کنم روی Shared host ها نمیشه سرور سوکت اجرا کرد. یعنی حداقل تاجاییکه بنده یکی دو بار تست هم کردم نشد؛ که البته فکر میکنم دلایل منطقی هم داشته باشه. هم از نظر فنی و هم از نظر امنیتی و هم از نظر قوانین و مسائل دیگر فکر میکنم جلوش گرفته شده.

بعد در سمت مرورگر چطور از چه طریقی باید با این سرور سوکت ارتباط برقرار کرد؟ فلش؟ جاوا؟
چون بنظرم با ایجکس که فقط میشه ارتباط در سطح HTTP داشت. حالا ارتباط با سوکت هم شاید بشه یه کلکی سوار کرد، ولی شاید جالب و بهینه از آب درنیاد.

راستی یه چیزی هم در استانداردهای جدید HTML5 و اینا هست بنام Websocket. ولی احتمالا از نظر ساپورت مرورگرها و در درجهء بعدی همچنین شاید سرورهای وب (چون بنظرم سمت سرور هم باید ساپورت بشه) هنوز درحدی نباشه که بخواید ازش استفاده کنید.

ضمنا اینطور برنامه ها رو بهرحال بنظر بنده باید اول از انواع ساده و محدود شروع و تست و تجربه کرد و قدم به قدم و بصورت تکاملی پیش رفت. اگر کسی که تاحالا همچین برنامه هایی ننوشته بخواد در قدم اول روی یک نمونهء بزرگ و جدی و پیچیده کار کنه بنظرم به مشکل میخوره؛ تازه اگر بخواد از سوکت استفاده کنه احتمالا کارش دشوارتر و حجیم تر هم میشه و سطح پایین تر هست بهرحال.
فکر میکنم رسیدن به برنامه های خاص موفق باید از طریق مسیر تدریجی و تکاملی خودش باشه.
تاریخچهء بسیاری از برنامه های موفق هم به همین شکل بوده تاجاییکه میدونم.

یعنی اول از چت ساده با فناوریها و استانداردهای دم دست شروع کنید.
مثلا اول از نوع ایجکس عادی.
بعد مثلا با روش comet پیاده سازی کنید.
بعد اگر دیدید اینا کارتون رو راه نمیندازه، میتونید سوکت رو امتحان کنید.
تازه خود برنامهء چت هم چقدر پیچیده باشه، برای چه ترافیکی طراحی بشه، چه امکاناتی داشته باشه؛ بنظرم اینا رو هم حداقل تاحدی باید با هر فناوری به تکامل رسوند و تست کرد.
حتی شاید اول بخواید از چت دو نفره شروع کنید که ساده تر باشه.
خلاصه بنده بیش از این نمیدونم دیگه اینا رو باید در عمل دنبالش رفت و تحقیق و تست کرد و اون موقع آدم خیلی چیزها رو متوجه میشه و خیلی مسائل اون موقع تازه مشهود یا حل میشن.


و همچنین چه استفاده هایی مفید دیگری میشه از سوکت پروگرمینگ کرد که نمیشه این کار ها رو با خود برنامه نویسی(یعنی همین دریافت و ذخیره و ...) انجام داد؟
اینطور سوالات کلی جواب دادنش سخته. چون نیاز به اطلاعات و بینش گسترده داره و اینکه یه تصویر ذهنی جامع و دقیقی در ذهنت باشه. و بنظرم همچنین نیازمند تجربهء عملی کافی.
ما معمولا به دنبال نیاز است و در همون جادهء مشخص و محدود خودمون که داریم پیش میریم، که بعد دنبال راه حل و ابزار مناسب میریم. همه چیز رو که از قبل نرفتیم تجربه کنیم.

شخصا تاحالا استفادهء خاصی از سوکت نکردم و ایده ای هم در این باب ندارم. بنظرم اکثر کارها رو میشه با برنامه نویسی و امکانات سطح بالاتر و راحتتر و سریعتری هم انجام داد. ولی خب سوکت هم خوبه دیگه و جالبه و آدم باید بلد باشه تا یوقت نیاز شد استفاده کنه. یه جاهایی سر همین ها کار آدم ممکنه گیر کنه. اصلا همین که بلدی باعث میشه چیزهای دیگر رو هم راحتتر و کاملتر درک و استفاده کنی، چون همشون به هم ربط دارن.
ما معمولا با سوکت مستقیما کار نمیکنیم، اما با لایه ها و رابطهای سطح بالاتری که کار میکنیم اونا خودشون در لایه های پایین تر دارن با سوکت کار میکنن و یکسری از تاثیرات و مسائل فنی و اصطلاحات و غیره از اون سطوح پایین تر به سطوح بالاتر هم خواهی نخواهی منتقل میشه و ربط پیدا میکنه (و همینطور بعکس از لایه های بالاتر به پایین تر، ولی بنظرم به درجات کمتری).
مثلا وب سرور آپاچی خودش چیه؟ خب اونم درواقع یک سرور سوکت است که روی پورت 80 گوش میکنه. وقتی صفحه ای رو در مرورگر باز میکنید، مرورگر، البته بعد از پیدا کردن IP سرور، یک ارتباط سوکت TCP با وب سرور ایجاد کرده و بعد بر اساس پروتکل HTTP با وب سرور صحبت و اطلاعات رو دریافت میکنه.
سوکت کانال ارتباطی ای است که دیتا با هر فرمت و تحت هر پروتکلی میتونه از طریق اون رد و بدل بشه. و حتی بدون پروتکل خاصی.

ضمنا الان در برنامه های PHP برای ارتباط با سرویسهای اینترنت curl وجود داره که کارها رو راحت کرده و نیازی نیست مستقیما با سوکت کار کنید. ولی یک وقت مثلا اگر بخواید با پروتکل خاصی ارتباط برقرار کنید که curl یا کتابخانهء سطح بالاتر دیگری براش در دسترستون نیست، میتونید از سوکت استفاده کنید.

تاجاییکه میدونم (البته از نظر اطلاعاتی/تئوریک و نه تجربی)، معمولا اگر API و پروتکل موجود یا سطح بالاتری هست، اصولی و بهترش اینه که از همون رابط سطح بالا استفاده کنید. و از اختراع پروتکل های جدید یا کار در سطح پایین اجتناب کنید.

zahra_68
یک شنبه 30 شهریور 1393, 09:39 صبح
با سلام به دوستان
اگر کسی از webSocket در جاوااسکریپت هم چیزی داره لطفا به اشترک بذاره

2undercover
یک شنبه 30 شهریور 1393, 12:12 عصر
برای ارتباط از طریق مرورگر به سرور با جاوااسکریپت کتابخانه WebsocketJS هست که پشتیبانی خوبی از مرورگر ها داره و به این صورت هست که اگر مرورگر از Websocket API پشتیبانی بکنه از همین API استفاده می کنه و در غیر این صورت از فلش استفاده می کنه. در مورد سمت سرور هم کتابخانه Ratchet برای PHP هست که کار رو راحت می کنه.