سوکت چیست ؟

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

و اما چیزهای مثل HTTP و FTP و SMTP و POP3 چی هستن؟
اینها پروتکل هستن. یعنی قراردادها و استانداردهایی که تعیین میکنن برنامه های مختلف چطور با هم صحبت کنن.
پروتکل مثل زبان است. مثلا زبان انگلیسی، عربی، فارسی و غیره.
و سوکت یه دستگاه ارتباطی مثل تلفن است.

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

حالا ما یه تست عملی هم انجام میدیم:

<?php

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$result = socket_connect($socket, 'localhost', 80);

socket_write($socket, "please send me your web page!\r\n\r\n");

echo "Response:<hr>";

echo socket_read($socket, 2000);

socket_close($socket);

?>

ما در این برنامهء PHP با استفاده از سوکت به وب سرور محلی خودمون متصل میشیم، چون به پورت 80 متصل میشیم که پورت سرویس دهی HTTP است. بنابراین ما باید بعد از اتصال با سوکت، با زبان HTTP با سرور صحبت کنیم، اما ما عمدا این کار رو نکردیم و به سادگی عبارت please send me your web page رو به سرور میفرستیم که چون بر طبق قراردادهای پروتکل HTTP نیست در نتیجه سرور منظور ما رو متوجه نمیشه و در پاسخ بهمون خطای 400 Bad Request رو ارسال میکنه و در متن صفحه ای که بعنوان پیام خطای قابل مشاهده برای کاربر ارسال میکنه نوشته:

Your browser (or proxy) sent a request that
this server could not understand.

که ترجمش میشه:
مرورگر (یا پراکسی) شما درخواستی ارسال کرد که این سرور نتوانست بفهمد.

دیدید که ما با استفاده از سوکت تونستیم به یک وب سرور متصل بشیم و اطلاعاتی رو بهش ارسال کنیم و اطلاعاتی رو دریافت کنیم، تا اینجا این کار سوکت بود که بدون هیچ اشکالی هم انجام شد؛ اما چون از پروتکل لازم استفاده نکردیم، طرف مقابل منظور ما رو متوجه نشد و در نتیجه این ارتباط بی فایده بود (تنها نتیجهء مفید این بود که فهمیدیم یک برنامه روی پورت 80 فعاله که ارتباطهای TCP رو قبول میکنه).

حالا ما دوباره با سوکت به سرور متصل میشیم اما این بار با زبان پروتکل HTTP باهاش صحبت میکنیم:

<?php

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$result = socket_connect($socket, 'localhost', 80);

socket_write($socket, "GET / HTTP/1.1\r\nHost: localhost\r\n\r\n");

echo "Response:<hr>";

echo socket_read($socket, 2000);

socket_close($socket);

?>


در نتیجه این بار سرور منظور ما رو متوجه میشه و یک پاسخ 200 OK بهمون برمیگردونه که محتوی کدهای HTML حاصل از صفحهء index سایت ماست.