برنامه نویسی سوکت یا سوکت پروگرمینگ چیست؟ (Socket Programming)
به طور کلی، هر کامپیوتر (به ازای هر کارت شبکهاش) یک IP دارد؛ که از طریق این IP، میتوان به ماشین فوق دسترسی پیدا نمود. این آدرس (IP) به 65535 پورت (PORT) تقسیم میشود.
PORT یک مفهوم منطقی است؛ که به کمک آن میتوان بهطور همزمان، با چندین ماشین دیگر ارتباط برقرار نمود. پورتها به دو گروه رزرو شده (پورتهای بین 1 تا 1024) و غیر رزرو شده (سایر پورتها) تقسیم میشوند. پورتهای رزرو شده، برای کاربردهای استاندارد مورد استفاده قرار میگیرند. مثلا: در برنامههای سرور/کلاینت (Server/Client)، از پورتهای غیر رزرو شده که آزاد باشند ( مورد استفادهی سایر برنامهها نباشند) میتوان جهت برقراری ارتباطات مورد نیاز، استفاده نمود؛ یعنی میتواند به ازای هر پورت، با یک برنامه ارتباط برقرار کند.
سوکت (Socket) یا پریز یا کانال در «شبکه»
- آدرس ماشینی که میخواهیم اطلاعاتی از آن بگیریم یا به آن ارسال کنیم.
- برنامهای از آن ماشین که درخواست اطلاعات کرده؛ و یا اینکه میخواهیم اطلاعاتی از آن برنامه کسب کنیم.
این دو، یعنی آدرس ماشین و شماره برنامه، به وسیلهی سوکت در شبکه مشخص میشوند. سوکت یک ارتباط قابل اطمینان جهت انتقال دادهها بین دو ماشین مجزا میباشد. سوکت، برنامهنویسان را از پیچیدگیهای فرآیند برقراری ارتباط بین دو ماشین مانند جزئیات کد کردن بستهها، فرآیند ارسال دادهها در شبکه، ارسال مجدد بستههای خراب و … دور ساخته و برنامهنویسان، به راحتی قادر به توسعهی برنامههای تحت شبکه میباشند.
یک سوکت همانطور که گفته شد، در حقیقت ترکیبی از آیپی (IP) یا نام هاست (HostName) و یک شماره پورت (Port Number) از آن آیپی میباشد. و بهطور کلی، یک سوکت چهار عمل اصلی زیر را انجام میدهد:
- اتصال به ماشین راه دور
- ارسال دادهها
- دریافت دادهها
- بستن یا خاتمهی اتصال
با توجه به تعاریف فوق، میتوان به راحتی تفاوت PORT و SOCKET را درک نمود.
تعریفی مفید از سوکت
در ابتدا یک تعریفی از پروتکل داشته باشیم:
در واقع پروتکل مثل زبان است! مثلا زبان انگلیسی، عربی، فارسی و … . و سوکت یک دستگاه ارتباطی مثل تلفن است. شما با تلفن زنگ میزنیدبه طرف مقابل، و او گوشی را بر میدارد؛ حالا یک کانال ارتباطی بین شما وجود دارد؛ که میتوانید از طریق آن، صدای همدیگر را بشنوید. اما فقط توانایی تبادل صدا کافی نیست؛ بلکه نیاز هست طرفین به زبان مشترکی صحبت کنند؛ تا حرف همدیگر را متوجه شوند. این زبان مشترک، همان پروتکلها هستند.
لذا در ارتباطات شبکه، قراردادهايی استفاده میشود تحت عنوان Protocol و پروتکولهای مختلفی ايجاد شده؛ اما در ارتباطات اينترنتی و شبکههايی که ارتباط دو طرفه است، بيشتر از نوع TCP/IP استفاده میشود؛ که اساس آن، بهصورت خيلی مختصر اینگونه است: برای هر کامپيوتر که به شبکه (اینترنت هم یک شبکه است!) وصل شود، يک IP مخصوص به خودش را داشته و به نوعی، آدرس آن کامپيوتر محسوب میشود؛ که تمام خصوصيات يک آدرس را که میشود متصور شد داراست.
اما چرا گفتیم در شبکههايی که ارتباط دو طرفه نياز است، از TCP/IP استفاده ميشود؟! چون انواع ديگری هم از جمله UDP وجود دارند؛ که تقريبا ارتباط يک طرفه میباشد؛ مثلا برای پخش برنامههای راديويی.
درباره سوکت بیشتر بدانیم:
اصلی ترين عامل در يک ارتباط شبکهای، Socket میباشد؛ که اعمال شبکه را بهصورت خواندن و نوشتن در يک فايل شبيهسازی نموده است. سوکت در اصل، مانند يک کانال ارتباطی است؛ که ميان دو نقطه ايجاد شده و اطلاعات، رد و بدل میشود. برای داشتن يک ارتباط شبکهای، بايد يک سوکت ايجاد کنيم؛ که لازمهی اين کار اين است که بدانيم به قصد برای گوش دادن میخواهیم ايجاد کنیم يا برای فرستادن پيام. اگر برای فرستادن پيام باشد، که واضح است نياز به آدرس مقصد داريم . اما اين کافی نيست!
برای فرستادن نامه، امروزه تنها آدرس ساختمان طرف کافی نبوده و نياز به شمارهی واحد آن هم هست (این فقط یک مثال بود). در کامپيوتر هم فقط آدرس کافی نبوده و شمارهی واحد برنامهای که گوش به زنگ میباشد هم نياز است؛ که به آن Port میگویند. يعنی شماره پورت هم نياز است.
در ضمن، یک چیز مهم این است که بدانید IPv4 (ورژن 4 آیپی)، از 4 عدد 0 تا 255 تشکيل شده و این 4 عدد، با نقطه از هم جدا میشوند. مثلا: 185.236.37.236 يک IP است! اما پورت اعدادی بين 1 تا (بصورت رایج) 65000 را میتواند شامل شود. (بله بزرگتر از این عدد هم میتواند شماره پورت شود!!!)
از آن جایی که بالاخره تعداد ارقام در مدل آیپی بالا محدود خواهد شد، ورژن 6 به نام IPv6 به وجود آمده است؛ که در اینجا، 6 عدد را شامل میشود و احتمالا نام آن نیز برای شما آشنا است.
در این جا ممکن است یک سوال پیش بیایید که بپرسید: هر کامپيوتر فقط يک IP دارد؛ پس يعنی در يک لحظه آيا فقط به يک کامپيوتر میتواند وصل شود؟!
جواب منفی است! درست است که IP يکی بيشتر نيست؛ اما تعداد متناهی پورت داريم! يعنی با هر پورت، به يک کامپيوتر متصل شده و میتوانيم تا 65000 ارتباط از صدقه سری پورتها داشته باشيم. اما اگر سوکت برای گوش دادن باشد؛ تنها کافییست که برای ایجاد سوکت بگوبیم با چه شماره پورتی میخواهیم ایجادش کنیم.
پروتکل Transmission Control Protocol ) TCP)
پروتکلی برای انتقال دادهها (سرویسها) بین دو ماشین با ضریب اعتماد بالا میباشد. چنین ارتباطی (بین دو نقطه) را Unicast مینامند. TCP پروتکل اتصالگرا (Connection-Oriented) است؛ یعنی ارتباط برقرار شده بین کلاینت و سرور تا پایان روند انتقال اطلاعات باقی میماند. این پروتکل در مواردی که اطمینان از انتقال صحیح دادهها بین مبدا و مقصد بسیار مهم است ( مانند زمان دانلود کردن دادهها)، مورد استفاده قرار میگیرد. در چنین حالتی، کامپیوتر مقصد با دریافت صحیح هر بسته از مبدا، یک Acknowledgment به منظور اطلاع از دریافت صحیح و بیعیب، به ماشین مبدا ارسال میکند؛ سپس اگر پیغام اعلام وصول فوق به مبدا نرسد، مبدا دوباره بسته را ارسال میکند.
پروتکل User Datagram Protocol) UDP)
یک پروتکل بدون اتصال (Connection-Less) میباشد. این پروتکل، امکان توزیع دادهها را با سرعت بالا تضمین میکند؛ ولی هیچ تضمینی در جهت صحت ارسال دادهها و دریافت آنها توسط ماشین مقصد ارائه نمیدهد. براساس شرایط این پروتکل، اگر در روند انتقال اطلاعات مشکلی پیش آمده و بستهی ارسال شده، بهصورت کامل به مقصد نرسد، بستهی فوق، مجددا برای کامپیوتر مقصد ارسال نخواهد شد.
به عنوان مثال، در سایتهایی که اقدام به پخش موسیقی از طریق اینترنت میکنند، از این پروتکل استفاده میشود. در بعضی لحظات در حین گوش دادن به موسیقی، متوجه قطع و وصل شدن یا مکث در پخش موسیقی میشویم. علت این امر نیز همانطور که گفته شد، نرسیدن یک یا چند بسته از بستههای ارسالی میباشد.
منابع: f1note، pnu-club و ویکی پدیا
سلام آقا هادی
ممنون از مطلبتون
بسیار شفاف و کامل توضیح داده بودید.
اگه دوست داشتید به وبسایت من هم سر بزنید.
سلام، ممنون از شما
موفق باشید
ممنون از توضیحاتتون
سلام
خیلی ممنون از مطلب کاملتون
فقط من یک سوال داشتم من اگه بخوام یک فایل رو در شبکه بفرستم که حجمش هم زیاده چطور میتونم فایل رو به buffer های کوچک تبدیل کنم و فایل رو بفرستم
سلام ، ممنون من تعریف سوکت رو با مثال اپارتمان در ذهنم نقش بست ،
مطلب خوب بیان شده و قابل درک هست . ممنون
با سلام
سپاس برای قرار دادن این مطالب مفید. من به شخصه بهره بردم.
برادر بزرگوار من یک کامپیوتر سرور و یک کلاینت دارم که با کابل شبکه در یک توپولوژی ستاره دای مرتبط هستند. سرور اطلاعات سنسور هارو از طریق کابل شبکه میگیره و کامپیوتر کلاینت با یک نرم افزاری که روش هست بصورت نمودار نمایش میده. این رو برای شرح حال گفتم.
اما کاری که من می خواهم انجام بدهم اینه که یک فایل با فرمت txt دارم که میخوام اطلاعاتش رو بر حسب زمانهایی که داده ها ثبت میشه روی فایل پایگاه داده با پسوند .dat روی سرور بریزم و این کار رو از طریق پورت COM انجام بدم یعنی هردو رو با Com متصل کنم. اگر طریقه انجام این کار رو برای پورت USB هم بگید ممنون میشم.
در مورد سطح خودم هم باید بگم تا حالا برنامه تحت شبکه ننوشتم و این اولین بارمه. (با C# کار میکنم)
سپپپپپپاس فراوان. پیشاپیش.
امیدوارم که سوالم رو در مکان مناسبی پرسیده باشم. اگر باید جای خاصی سوالم رو مطرح کنم ممنون میشم راهنمایی کنید.
پاسخ شما= سپاس برای پاسخ شما.
dadash damet garm
agha vaghean dame shoma garm. belakhare ye matlabe kamelo vazeh payda kardam
تعداد پورت ها رو درست گذاشتید جناب؟ 65535 نیست؟
سلام. درصورتی که منظورتون ابتدای متنه بله اشتباها یک عدد بیشتر قرار گرفته. ممنون از اطلاع رسانیتون.
عالی بود الان فهمیدم که سوکت پراگرمینگ چیه
خیلی ممنون از توضیحاتتون
موفق باشید 🙂
خیلی عالی کاربردی و ساده و جذاب بود
ممنون