socket-programming حالتی از برنامه نویسی در لایه کاربرد برای ارتباط و تبادل داده در شبکه میباشد در واقع میتوان گفت تمام برنامه های کاربردی در شبکه ( لایه Application ) با مفهومی به نام سوکت سر و کار دارند این مفهوم برای بر قراری ارتباط در برنامههای تحت شبکه و تبادل جریان داده بین پروسهها ابداع شد برای نوشتن یک برنامه با سوکت میتوان از توابعی که در زبانهای برنامه نویسی مختلف وجود دارد استفاده کرد که ما در اینجا بعضی از توابع اصلی که در زبان C موجود است را آوردهایم.
حال در ابتدا برای آنکه یک مدل ساده از شکل برنامه تحت پروتکل TCP/IP در شبکه را تصور کنیم ارتباط بین دو کامپیوتر توسط برنامه در شبکه را بررسی کرده و نحوه عملکرد آن را مرحله به مرحله در زیر میبینیم.
الف) از سیستم عامل خواسته میشود تا شرایط را برای برقراری یک ارتباط با کامپیوتری خاص (با آدرس IP مشخص) و برنامهای خاص روی آن کامپیوتر (با آدرس پورت مشخص ) فراهم کند و یا اصطلاحا سوکتی را بگشاید . در صورت موفقیت این کار سیستم عامل یک اشارهگر فایل را بر میگرداند و در غیر این صورت مقدار پوچ (NULL) به برنامه بر خواهد گرداند.
ب) با موفقیت آمیز بودن مرحله قبل میتوان به همان شکل که در یک فایل مینویسید یا میخوانید میتوانید با توابع send یا write و recv یا read به مبادله داده پرداخت .
ج) بعد از اتمام مبادله داده ارتباط مانند یک فایل بسته میشود(با تابع close).
انواع سوکت
سوکتهای نوع استریم که سوکتهای اتصال گرا نامیده میشود .
سوکتهای نوع دیتاگرام که سوکتهای بدون اتصال نامیده میشود .
روش ارسال برای سوکتهای استریم همان روش TCP است و همراه با همان خصوصیات و دقیقا مبتنی بر پروتکل TCP بوده و طبیعتا قبل از تبادل داده یک اتصال باید برقرار بشود . در دیتاگرام هم مانند UDP به شکلی نامطمئن میباشد و بدون نیاز به برقراری هیچ ارتباط یا اتصال داده مبادله میشود .
در حقیقت ما با استفاده از سوکتها میخواهیم یک ابزار برای استفاده از پروتکل TCP یا UDP در اختیار داشته باشیم .
سوکت یک مفهوم انتزاعی از تعریف ارتباط در سطح برنامهنویسی خواهد بود و برنامهنویس با تعریف سوکت عملا تمایل خود را برای مبادله داده به سیستم عامل اعلام کرده و بدون درگیر شدن با جزئیات پروتکلهای TCP یا UDP از سیستم عامل میخواهد تا فضا و منابع مورد نیاز را جهت برقراری یک ارتباط ایجاد کند.
در برنامهنویسی شبکه باید توجه کرد که هر ارتباطی دو طرفه میباشد لذا طرفین در ابتدا باید تمایل خود را برای مبادله داده به سیستم عامل اعلام کنند . در هر ارتباط یکی از طرفین شروع کننده است و اقدام به در خواستی برای ارتباط میکند که در سمت مشتری است در سمت دیگر برنامه سرویس دهنده منتظر است تا تقاضایی مبنی بر برقراری ارتباط دریافت کند و پاسخ مناسب را ارسال نماید در صورت پذیرش ارتباط مبادله داده امکان پذیر خواهد شد.
مشخص است ساختار برنامه در سرویس دهنده و مشتری با هم متفاوت خواهد بود.
در برنامه سمت سرور به عملیات زیر انجام میگیرد :
الف) یک سوکت را که مشخصه یک ارتباط است بوجود آورده در همین مرحله نوع ارتباط درخواستی را به سیستم عامل معرفی مینمائید(با تابع socket).
ب) به سوکت باز شده یک آدرس پورت نسبت داده میشود یعنی به سیستم عامل اعلام میشود تمام بستههای دریافتی با این شماره پورت را به سمت برنامه هدایت کند این کار با تابع bind انجام میگیرد.
ج) در مرحله بعد باید به سیستم عامل اعلام پذیرش تقاضاهای ارتباط انجام بگیرد تا فضا و منابع لازم شامل بافر را جهت ارسال و دریافت دادهها ایجاد نماید در اینجا باید تعداد حداکثر پذیرش تقاضا را نیز مشخص کرد این مرحله با تابع (listen) انجام پذیر است.
د) نهایتا از سیستم عامل میخواهیم یک ارتباط معلق را به برنامه شما معرفی کند(در صورت وجود) به وسیله تابع (accept) انجام پذیر است.
ه) برای مبادله دادهها از ذستوراتsend و recv استفاده میشود.
و) در پایان ارتباط خاتمه داده میشود با توابع close و shutdown دو طرفه و یکطرفه قطع مشود.
در برنامه سمت مشتری اعمال ب و ج و د لازم نیست و چون شروع کننده میباشد به جای آن باید برای برقراری ارتباط با سرویس دهنده از تابع استفاده می شود و در صورت موفقیت آمیز بودن مراحل بعد ارسال و دریافت داده و درآخر قطع ارتباط انجام میگیرد.
در برنامههایی که با سوکت دیتاگرام کار می کنند در سمت سرویس دهنده موارد ج و د وجود ندارد همچنین در سمت مشتری نیز احتیاجی به connect نیست و بدون هیچ کار اضافه به تبادل دادهها میپردازیم و این به دلیل خواص پروتکل UDP می باشد.
منبع : technician.blogsky.com