دانلود - Jabry

Download Report

Transcript دانلود - Jabry

‫مهندسی اینترنت فصل ‪7‬‬
‫مقدمه‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫در این فصل اصول کلی برنامه نویسی شبکه و مفهوم ”برنامه‬
‫نویسی سوکت“ (‪(socket programming‬را مورد بررسی‬
‫قرار می دهیم‬
‫با مثال های ساده‪ ،‬روش نوشتن برنامه های کاربردی تحت پروتکل‬
‫‪ TCP/IP‬را تشریح خواهیم کرد‬
‫در حقیقت این فصل نقطه آغازی است برای تمام برنامه نویسانی‬
‫که برنامه کاربردی تحت شبکه اینترنت مینویسند‬
‫سنگ بنای تمام برنامه های کاربردی الیه چهارم‪ ،‬مفهومی به نام‬
‫سوکت است‬
‫‪‬‬
‫این مفهوم توسط طراحان سیستم عامل یونیکس به منظور برقرای‬
‫ارتباط برنامه های تحت شبکه و تبادل جریان داده بین پروسه ها‬
‫ابداع شده‪.‬‬
‫‪ (( ‬در دنیای یونیکس هر چیزی می تواند به صورت یک فایل تلقی‬
‫و مدل شود))‬
‫تمام عوامل وانواع ورودی وخروجی ها میتوانند توسط سیستم فایل‬
‫مدل شوند بنابراین تمام عملیاتی که برنامه نویس برای بکارگیری‬
‫دستگاههای مختلف باید بداند یکسان و ساده و شفاف است‬
‫‪‬‬
‫اگر ساختار فایل را برای ارتباطات شبکه ای تعمیم بدهیم آنگاه‬
‫برای برقراری ارتباط بین دوبرنامه روی کامپیوترهای راه دور‬
‫روال زیر توضیح داده شده ‪:‬‬
‫‪‬‬
‫الف)از سیستم عامل بخواهید تا شرایط را برای برقراری یک‬
‫ارتباط با کامپیوتری خاص( با آدرس ‪ IP‬مشخص) و برنامه ای‬
‫خاص روی آن کامپیوتر ( با آدرس پورت مشخص) فراهم کند یا‬
‫سوکتی را بگشاید‬
‫‪ ‬اگراین کارموفقیت آمیز بود سیستم عامل برای شما یک اشاره‬
‫گر بر میگرداند ودرغیراین صورت طبق معمول مقدار پوچ (‬
‫‪ )NULL‬را برمیگرداند‬
‫‪‬‬
‫ب) در صورت موفقیت آمیز بودن مرحله ی قبل میتوانید با توابع‬
‫)(‪ send‬یا )(‪ write‬و )(‪ recv‬یا )(‪ read‬درون یک فایل‬
‫بنویسید یا بخوانید‬
‫‪‬‬
‫ج) پس از اتمام عملیات مبادله ارتباط را همانند یک فایل معمولی‬
‫ببندید ( با تابع )(‪)close‬‬
‫‪‬‬
‫برای اینکه یک اشاره گر سوکت را از سیستم عامل طلب کنید تا‬
‫مقدمات ارتباط برقرار شود بایستی تابع سیستمی )(‪ socket‬را در‬
‫برنامه خود صدا بزنید درصورتی که عمل موفقیت آمیز بود‪ ،‬یک‬
‫اشاره گر غیر پوچ بر میگرداند‬
‫از این پس هرگاه از“ سوکت باز“ یا مبادله داده بر روی سوکت یاد کردیم‪،‬‬
‫منظوراشاره به یک ارتباط بازیا مبادله ی اطالعات بین دونقطه ‪TSAP‬‬
‫روی دو ایستگاه شبکه است‬
‫‪Transport Service Access Point : TSAP ‬‬
‫یک پروسه و یا در واقع یک برنامه در حال اجرا روی سیستم را‬
‫مشخص میکند‬
‫در یک برنامه تحت شبکه همانند فایل ها نیز میتوان همزمان چندین‬
‫ارتباط فعال و باز بین چندین پروسه داشت و با مشخصه ی هر‬
‫یک از این ارتباطها روی هر کدام از آنها مبادله داده انجام داد‬
‫انواع سوکت و مفاهیم آنها‬
‫‪ ‬سوکتهای نوع استریم که سوکتهای اتصال گرا‬
‫)‪ )Connection oriented‬نامیده میشوند‬
‫‪ ‬سوکتهای نوع دیتا گرام که سوکتهای بدون اتصال‬
‫)‪ )Connectionless‬نامیده میشوند‬
‫‪‬‬
‫‪‬‬
‫سوکتهای نوع استریم دقیقا ً بر روی پروتکل ‪ TCP‬بوده ‪ :‬پروتکل‬
‫‪ TCP‬پروتکلی است که داده ها را با رعایت ترتیب و خالی از خطا‬
‫مبادله میکند و پروتکل ‪ IP‬که درالیه زیرین آن واقع است با‬
‫مسیریابی بسته ها روی شبکه سرو کار دارد و طبیعتا ً قبل از مبادله‬
‫داده ها باید یک اتصال به روش دستکانی سه مرحله ای‬
‫(‪ (tree way handshake‬بین دو پروسه ی نهایی برقرار بشود‬
‫پروتکل انتقال فایل “ ‪ ,“ FTTP‬پروتکل انتقال نامه های الکترونیکی‬
‫”‪“ SMTP‬و پروتکل انتقال صفحات ابرمتن “‪ ” HTTP‬همگی‬
‫نیازمند برقرای یک ارتباط مطمئن و عاری از خطا هستند وطبعا ً از‬
‫سوکتهای نوع استریم بهره می برند‬
‫‪‬‬
‫سوکت نوع دیتا گرام مبتنی بر پروتکل ‪ UDP‬است و بدون نیاز به‬
‫برقراری هیچ ارتباط و یا اتصال ‪ ,‬داده ها مبادله میشوندو تضمینی‬
‫دررسیدن داده ها به شکل صحیح و کامل وجود ندارد ولی با تمام‬
‫این مشکالت بازهم دربرخی ازکاربرد ها مثل انتقال صدا و تصویر‬
‫مورد استفاده قرار میگیرد‬
‫‪‬‬
‫تنها حسن استفاده از سوکتهای دیتاگرام ‪ ,‬سرعت تحویل دادها است‬
‫‪‬‬
‫سوکت یک مفهوم انتزاعی ازتعریف ارتباط درسطح برنامه نویسی‬
‫است و برنامه نویس با تعریف سوکت عمالً تمایل خود را برای‬
‫مبادله ی داده ها به سیستم عامل اعالم کرده و بدون درگیر شدن با‬
‫جزییات پروتکل ‪ TCP, UDP‬از سیستم عامل می خواهد تا فضا و‬
‫منابع مورد نیاز را جهت برقراری یک ارتباط ایجاد کند‬
‫مفهوم ‪: Client /Server‬‬
‫‪‬‬
‫در برنامه نویسی سوکت هرارتباط دوطرفه بین دو پروسه کاربردی‬
‫تعریف میشود‪ ،‬درهرارتباط یکی ازطرفین‪ ،‬شروع کننده ارتباط تلقی‬
‫میشود ( ‪ )Initiator‬وطرف مقابل در صورت آمادگی آن را میپذیرد‬
‫(‪ ، )listener‬اگر برنامه ای را که شروع کننده ارتباط است ‪،‬‬
‫“برنامه مشتری“ بنامیم برنامه ای که این ارتباط را میپذیرد‬
‫” سرویس دهنده “ نام خواهد گرفت‬
‫‪‬‬
‫‪ Client‬پروسه ایست که نیازمند اطالعات میباشد و ‪ Server‬پروسه‬
‫ای ایست که اطالعات دراختیاردارد وتمایل دارد تا این اطالعات را‬
‫به اشتراک بگذارد و منتظراست تا یک متقاضی ‪ ،‬واحدی از این‬
‫اطالعات را طلب کند وآن را تحویل دهد به عنوان مثال ‪ :‬سرویس‬
‫دهنده وب (‪)web Server‬‬
‫‪ ” ‬برنامه سمت سرویس دهنده“ (‪ )Server Side‬برنامه ایست که‬
‫روی ماشین سرویس دهنده نصب میشود و و منتظر تقاضایی جهت‬
‫برقراری ارتباط است که پس از پردازش تقاضا پاسخ مناسب را‬
‫ارسال کند بنابراین شروع کننده ی ارتباط نیست بلکه در حال‬
‫انتظار یا شنود است‬
‫‪‬‬
‫” برنامه سمت مشتری” ( ‪ )Client Side‬برنامه ایست که بنابر‬
‫نیاز اقدام به درخواست اطالعات میکند‪ ،‬تعداد مشتری ها روی‬
‫ماشین های متفاوت یا حتی روی یک ماشین میتواند زیاد باشد ولی‬
‫معموالً تعداد سرویس دهنده ها( برروی یک ماشین واحد یا سرویس‬
‫مشابه ) یکی است برای مثال‪ :‬جلسه پرسش و پاسخ با یک نفر‬
‫صاحب اطالعات‬
‫‪SERVE‬‬
‫‪R‬‬
‫تقاضای یک‬
‫یا چند آیتم اطالعات‬
‫‪Client‬‬
‫آیتم های بازگشتی‬
‫تعامل بین سرویس دهنده مشتری ‪Client/ Server‬‬
‫عملیات در سمت ‪: Server‬‬
‫‪‬‬
‫الف) یک سوکت راکه مشخصه یک ارتباط است بوجود آورید ‪ ،‬با این کار به‬
‫سیستم عامل اعالم کردیم که نیازمند یک ارتباط هستیم و نوع ارتباط درخواستی‬
‫خود را (‪ )TCP , UDP‬معرفی میکنید این کار در محیط سیستم عامل یونیکس‬
‫و تقریبا تمام سیستمهای عامل توسط تابع سیستمی )(‪ Socket‬انجام میشود‪.‬‬
‫‪‬‬
‫ب)به سوکت باز شده یک آدرس پورت (آدرس سرویس دهنده) نسبت بدهید این‬
‫کار توسط تابع سیستمی )(‪ bind‬انجام میشود‪ ،‬بنابراین به سیستم عامل اعالم‬
‫میکنید که تمام بسته های ‪( TCP‬یا ‪ )UDP‬را که آدرس پورت مقصدشان با‬
‫شماره مورد نظر شما مطابقت دارد‪ ،‬به سمت برنامه شما هدایت کند‪.‬‬
‫”دقت کنید! در برنامه سمت سرویس دهنده استفاده از دستور )(‪Bind‬‬
‫الزامی است‪“.‬‬
‫‪‬‬
‫ج) دراین مرحله شروع پذیرش تقاضاهای اتصال ‪ TCP‬را به سیستم عامل‬
‫اعالم میکنید این کار توسط تابع سیستمی )(‪ listen‬انجام میشود وچون ممکن‬
‫است تعداد تقاضاهای اتصال متعدد باشد باید تعداد ارتباط ‪ TCP‬را که میتوانید‬
‫پذیرای آن باشید‪ ،‬تعیین کنید چرا که سیستم عامل برای پذیرش ارتباطات ‪TCP‬‬
‫فضا ومنابع درنظرمی گیرد و باید این تعداد کمتر از مقداری باشد که سیستم‬
‫عامل به عنوان حداکثر تعیین کرده‪.‬‬
‫‪‬‬
‫د) با استفاده از تابع )(‪ Accept‬از سیستم عامل بخواهید یکی از ارتباطات‬
‫معلق را به برنامه شما معرفی کند‬
‫‪‬‬
‫ه) از دستورات )(‪ send‬و )(‪ recv‬برای مبادله داده استفاده کنید‬
‫‪ ‬و) نهایتا ً ارتباط را خاتمه دهید‪:‬‬
‫قطع ارتباط دوطرفه ارسال و دریافت ( )(‪) Close‬‬
‫قطع ارتباط یکی از عملیات ارسال یا دریافت ()(‪)Shutdown‬‬
Server ‫برنامه ی سمت‬
Socket()
Bind()
Client ‫برنامه ی سمت‬
Listen()
Socket()
Connection request
‫تکرار دائم‬
Connect()
Accept()
Fork / Thread
Fork()
‫ادامه پذیرش‬
‫ایجاد پروسه ی فرزند‬
‫تکراربه دفعات مورد نیاز‬
‫تکراربه دفعات مورد نیاز‬
‫‪request‬‬
‫)(‪send‬‬
‫)(‪recv‬‬
‫‪Process….‬‬
‫)(‪send‬‬
‫)(‪Close‬‬
‫‪response‬‬
‫)(‪resv‬‬
‫سرویس دهنده فرزند‬
‫)(‪close‬‬
‫عملیات در سمت ‪: Client‬‬
‫‪‬‬
‫الف)یک سوکت را که مشخصه یک ارتباط است‪ ،‬بوجود می آوریم‬
‫بنابراین به سیستم عامل اعالم شده است که نیازمند تعریف یک ارتباط‬
‫هستید‬
‫‪‬‬
‫ب) در این مرحله احتیاجی به استفاده از دستور)(‪ Bind‬نیست زیرا‬
‫برنامه سمت مشتری منتظر تقاضای ارتباط از دیگران نیست بلکه‬
‫خودش متقاضی برقراری ارتباط با یک سرویس دهنده است بنابراین‬
‫در صورت نیاز تقاضا را با استفاده از تابع سیستمی)(‪ connect‬به‬
‫سمت آن سرویس دهنده بفرستید این دستور متولی انجام مراحل دست‬
‫تکانی سه مرحله ای در برقراری یک ارتباط ‪ TCP‬است اگرعمل‬
‫)(‪ Connect‬موفقیت آمیز بود به معنای موفقیت در برقراری یک‬
‫ارتباط ‪ TCP‬با سرویس دهنده است‬
‫‪‬‬
‫‪‬‬
‫ج) از توابع )(‪ send‬و)(‪ recv‬برای ارسال یا دریافت داده ها(به‬
‫هر تعداد) اقدام نمایید‬
‫د) ارتباط را با توابع )(‪ close‬یا )(‪ shutdown‬به صورت‬
‫دوطرفه یا یک طرفه قطع نمایید‬
‫تاکید‪:‬‬
‫از تابع )(‪ bind‬زمانی استفاده میشود که پذیرای ارتباطات ‪ TCP‬با‬
‫شماره پورت خاصی باشید و چون برنامه سمت مشتری آغازکننده‬
‫ارتباط است شماره ی پورت مورد نیاز به طور خودکار سیستم‬
‫عامل انتخاب و به پروسه منتسب میشود‬
‫ساختمان داده های مورد نیاز در برنامه نویسی مبتنی بر سوکت‬
‫‪‬‬
‫اولین نوع داده ‪ ” ،‬مشخصه سوکت “ یا ‪Socket Descriptor‬‬
‫است ‪،‬که برای ارجاع به یک ارتباط باز مورد استفاده قرار میگیرد‬
‫مشخصه سوکت یک عدد صحیح دوبایتی است‬
‫; ‪int a‬‬
‫‪‬‬
‫دومین نوع داده برای ایجاد سوکت‪ ،‬یک استراکچراست که آدرس‬
‫پورت پروسه و همچین آدرس ‪ IP‬ماشین طرف ارتباط را در خود‬
‫نگه میدارد‬
‫‪Struct sockaddr‬‬
‫‪// Address family‬‬
‫‪//14 byte of protocol address‬‬
‫; ‪sa_family‬‬
‫; ‪sa_data 14‬‬
‫‪Unsigned short‬‬
‫‪Char‬‬
‫;‬
‫‪‬‬
‫‪ sa_family‬این فیلد خانواده یا نوع سوکت را مشخص میکند در‬
‫حقیقت این گزینه تعیین میکند سوکت مورد نظررا درچه شبکه ای‬
‫و روی چه پروتکلی بکار خواهید گرفت‪ ،‬بنابراین در سیستمی با‬
‫پروتکل و سوکت های متفاوت نوع سوکت باید تعیین شود در این‬
‫فصل شبکه اینترنت با پروتکل ‪ TCP/IP‬است و خانواده سوکت را‬
‫با ثابت ‪ AF_INET‬مشخص می کنیم‪.‬‬
‫‪‬‬
‫‪ sa_data‬این چهارده بایت مجموعه ای است از آدرس پورت‪،‬‬
‫آدرس ‪ IP‬و قسمتی اضافی که باید با صفر پر شود‬
‫)) در شبکه اینترنت آدرس ‪ IP‬چهاربایتی و آدرس پورت دو بایتی‬
‫است)(‬
‫‪Struct sockaddr_ in‬‬
‫‪// Address family‬‬
‫‪// port number‬‬
‫‪// Internet address‬‬
‫‪// same size az struct sochaddr‬‬
‫; ‪sin_family‬‬
‫; ‪sin_port‬‬
‫; ‪sin_addr‬‬
‫; ‪sin_zero 8‬‬
‫‪short int‬‬
‫‪unsigned short int‬‬
‫‪Struct in_addr‬‬
‫‪unsigned char‬‬
‫;‬
‫‪ sin_family‬همانند ساختار قبلی خانواده سوکت را تعیین میکند و برای شبکه‬
‫اینترنت مقدار ثابت ‪ AF _INET‬است‬
‫‪sin_port‬‬
‫‪sin_zero 8‬‬
‫این فیلد دو بایتی‪،‬بایتی آدرس پورت پروسه مورد نظراست‬
‫این هشت بایت در کاربردهای مهندسی اینترنت کال باید مقدار صفر داشته‬
‫باشد زیرا در شبکه اینترنت فعالً آدرس ‪ IP‬چهار بایتی و آدرس پورت دو بایتی است در حالی که‬
‫در برخی دیگر از شبکه ها طول آدرس بیشتر است بنابراین جهت استفاده این استراکچر در شبکه‬
‫اینترنت این هشت بایت اضافی باید با تابعی مانند )(‪ memset‬تماما ً صفر شود‬
‫آدرس ‪ IP‬ماشین مورد نظر را مشخص میکند این فیلد خود نیز یک‬
‫‪Sin_addr‬‬
‫استراکچر است که در حالت کلی عددی صحیح‪ ،‬بدون عالمت و چهاربایتی است‬
‫)‪(a structure for historical reasons‬‬
‫‪// that ’ s a 32 _bit long, or 4 bytes‬‬
‫‪// Internet address‬‬
‫‪Struct in_addr‬‬
‫; ‪Unsigned long s_addr‬‬
‫;‬
‫این فیلد چهار بایتی ( ‪ 32‬بیتی) برای نگهداری آدرس ‪ IP‬بکار میرود میتوانستیم آن‬
‫را به طور مستقیم به شکل ‪ unsigned long‬معرفی کنیم ولی به دالیل تاریخی به‬
‫این صورت تعریف شده !‬
‫ماشینهای ‪ Big Eending‬و ‪Little Ending‬‬
‫ساختار بسته های ‪ IP‬و ‪ TCP‬درقالب کلمات ‪ 32‬بیتی سازماندهی شوند‬
‫ماشینهای متفاوتی که در دنیا وجود دارد کلمات دو بایتی و چهار بایتی‬
‫را به روش یکسانی ذخیره نمی کنند ‪ .‬به عنوان مثال فرض کنید یک‬
‫کلمه ‪ 2‬بایتی با دستور ‪( MOV‬یا ‪ )Load‬به حافظه اصلی منتقل شود‬
‫ماشینها به دوروش آن را درحافظه ذخیره میکنند‬
‫‪ )1‬ماشینهایی که بایت کم ارزش و سپس بایت پر ارزش را ذخیره میکنند‪،‬‬
‫ماشینهای ‪ Little Ending‬نامیده میشوند‬
‫‪ )2‬ماشینهایی که بایت پرارزش وسپس بایت کم ارزش را ذخیره میکنند‪،‬‬
‫ماشینهای ‪ Big Ending‬نامیده میشوند‬
‫پروتکل ‪،TCP/IP‬استاندارد ماشینهای ‪ Big Ending‬رامبنا قرارداده لذا درتمام‬
‫ماشینهای ‪ Little Ending‬قبل ازارسال بسته های ‪ IP‬بایدفیلدهای دوبایتی و‬
‫چهاربایتی درون حافظه‪،‬به گونه ای تنظیم و مقداردهی شود تا درهنگام ارسال‬
‫ابتدا بایت پرارزش ارسال شده و استانداردماشینهای ‪ B.E‬رعایت شود‬
‫‪ ‬مثال‪:‬‬
‫وقتی روی ماشین از نوع ‪ LE‬دستور زیر اجرا شود‪:‬‬
‫;‪Struct sockaddr _in My_socket‬‬
‫;‪My_ socket.sin_ port =0xB459‬‬
‫چون بایت کم ارزش ابتدا ذخیره میشود و بعد ازآن بایت پر‬
‫ارزش قرار میگیرد پس نحوه قرارگیری آن در بسته ‪ TCP‬به‬
‫صورت ‪ 59B4‬تنظیم میشود که نادرست است به همین دلیل‬
‫توابعی جهت رفع این مشکل معرفی شده است‬
‫”‪htnos)( _ “Host to Network Short‬‬
‫تابع تبدیل کلمات دو بایتی به حالت ‪BE‬‬
‫”‪htonl)( _ “Host to Network Long‬‬
‫تابع تبدیل کلمات چهاربایتی به حالت ‪BE‬‬
‫”‪ntohs)( _ “Network to Host Short‬‬
‫تابع تبدیل کلمات دو بایتی از ‪ BE‬به حالت فعلی ماشین‬
‫”‪ntohl)( _ “Network to Host Long‬‬
‫تابع تبدیل کلمات چهار بایتی از ‪ BE‬به حالت فعلی ماشین‬
‫مشکالت تنظیم آدرس ‪ IP‬درون فیلد آدرس‬
‫عموما ً کاربران تمایل دارندآدرس ‪ IP‬را به صورت چهار عدد صحیح دهدهی که با ‪.‬‬
‫جدا میشوند وارد کنند و ماهیت آن یک رشته کاراکتری خواهد بود نه یک عدد‬
‫صحیح چهار بایتی بدون عالمت ! در حالی که در استراکچر ‪ sockaddr_in‬فیلد‬
‫آدرس ‪ IP‬عددی است چهاربایتی که با یک عدد از نوع ‪ Long‬پرمیشود‪.‬‬
‫تابع ‪ inet_addr‬جهت تبدیل آدرسهای ‪ IP‬از رشته ای به عددی کاربرد دارد(یک‬
‫رشته کاراکتری به شکل نقطه دار را گرفته و به یک عدد چهار بایتی با قالب ‪BE‬‬
‫تبدیل میکند)‪.‬‬
‫; )”‪ina.sin_addr.s_addr = inet_addr(“10.12.110.57‬‬
‫تابع )(‪ inet_ntoa‬عکس ‪ ،‬عمل تابع قبلی را انجام میدهد یعنی یک آدرس ‪IP‬‬
‫چهاربایتی در قالب ‪ BE‬را گرفته وآن را به یک رشته ی کاراکتری نقطه دار‬
‫تبدیل میکند‪.‬‬
‫میتوان بجای استفاده از تابع )(‪ inet_addr‬از تابع خوش تعریف و مفیدتر‬
‫)(‪ inet_aton‬استفاده کرد‪.‬‬
‫; ‪Char *a1, *a2‬‬
‫‪// this is 192.168.4.14‬‬
‫‪// this is 10.12.110.57‬‬
‫; )‪a1 = inet_ntoa ( ina1 .sin_addr‬‬
‫; )‪a2 = inet_ntoa ( ina2 .sin_addr‬‬
‫خروجی‬
‫‪address 1: 192.168.4.14‬‬
‫‪address 2 : 10.12.110.57‬‬
‫توابع مورد استفاده در برنامه سرویس دهنده (مبتنی بر سوکتهای استریم)‬
‫‪‬‬
‫تابع )(‪ socket‬فرم کلی آن‪:‬‬
‫‪‬‬
‫‪ Domain‬این پارامتر نشان دهنده خانواده سوکت است و در برنامه نویسی شبکه اینترنت با‬
‫‪ ، TCP/IP‬با مقدار ثابت ‪ PF_INET‬تنظیم میشود‬
‫‪‬‬
‫‪ Type‬با این پارامتر نوع سوکت را اعالم میکند که میتواند نوع استریم یا از نوع دیتاگرام باشد‬
‫‪ socket_stream‬و یا ‪ stream_dgram‬باشد‬
‫‪‬‬
‫‪ Protocol‬در این فیلد شماره شناسایی پروتکل مورد نظرتان را تنظیم میکنید که برای‬
‫کاربردهای شبکه اینترنت همیشه مقدارآن صفراست‬
‫‪‬‬
‫اگر مقدار بازگشتی تابع )(‪ -1 ، socket‬باشد عمل موفقیت آمیزنبوده کارباید متوقف شود ومتغیر‬
‫سراسری )(‪ errno‬شماره ی خطای رخ داده را برمیگرداند‬
‫) ‪Int socket ( int domain , int type , int protocol‬‬
‫‪‬‬
‫تابع )(‪ bind‬معموالً در برنامه سمت سرویس دهنده معنا دارد‪ ،‬شما ازاین طریق از سیستم عامل‬
‫خواهش میکنید تمام بسته های ‪TCP‬یا ‪ UDP‬با شماره پورت خاص را به سمت برنامه شما هدایت‬
‫کند‬
‫;)‪Int bind (int sockfd, struct sockaddr *my_addr, int addrlen‬‬
‫‪‬‬
‫‪ Sockfd‬همان مشخصه سوکت است که با استفاده از تابع )(‪ socket‬باز کردید‬
‫‪‬‬
‫‪ my_addr‬یک استراکچر که خانواده سوکت‪ ،‬آدرس پورت و آدرس ‪ IP‬ماشیم محلی را در خود‬
‫نگه میدارد‬
‫‪‬‬
‫‪ addrlen‬شامل طول استراکچر ‪ my_addr‬بر حسب بایت است‬
‫‪‬‬
‫تابع )(‪ listen‬این فقط در برنامه سرویس دهنده معنا می یابد ‪(،‬همان عمل گوش‬
‫کردن و منتظر ماندن است) در یک عبارت ساده اعالم به سیستم عامل برای‬
‫پذیرش تقاضاهای ارتباط ‪ TCP‬است سیستم عامل باید بداند که چند پروسه میتواند‬
‫به طور همزمان ارتباط ‪ TCP‬به یک ادرس پورت داشته باشد و انها را در صف‬
‫سرویس دهی قرار دهد‪.‬‬
‫;) ‪Int listen ( int sockfd , int backlog‬‬
‫‪‬‬
‫‪‬‬
‫‪ sockfd‬همان مشخصه سوکت است‪.‬‬
‫‪ backlog‬حداکثرتعداد ارتباط معلق و به صف شده ی منتظراست که در بسیاری‬
‫از سیستمها مقدار‪ backlog‬به ‪ 20‬محدود شده‪.‬‬
‫( مانند توابع قبلی در صورت بروز خطا مقدار برگشتی این تابع ‪ -1‬خواهد بود و‬
‫متغیر ‪ errno‬شماره خطای رخ داده را برمیگرداند )‬
‫‪‬‬
‫تابع )(‪accept‬‬
‫وقتی که تابع )(‪ accept‬اجرا میشئد برنامه شما از سیستم عامل می خواهد که از بین تقاضاهای به‬
‫صف شده یکی را انتخاب کرده و آن را با مشخصات پروسه طرف مقابل ‪ ،‬تحویل برنامه تان بدهد پس‬
‫تنها ‪ 1‬انتخاب وجود دارد بنابراین سیستم عامل یک مشخصه سوکت جدید ایجاد میکند ‪،‬‬
‫توسط تابع )(‪ accept‬به‬
‫توسط تابع )(‪ socket‬ایجاد شده و سوکت دوم‬
‫سوکت اول‬
‫برنامه شما برگشته ‪:‬‬
‫الف) سوکت اول شامل مشخصه تمام ارتباطات به صف شده ی منتظر است ‪.‬‬
‫ب ) سوکت دوم شامل مشخصه فقط یکی ازاتصاالت به صف شده ی معلق است‪.‬‬
‫;)‪int accept ( int sockfd , Struct sockaddr *addr , socklen_t *addrlen‬‬
‫‪ addr‬استراکچری است که سیستم عامل پس از پذیرش یک ارتباط معلق آدرس پورت و آدرس‪ IP‬طرف‬
‫مقابل ارتباط را به برنامه شما برمیگرداند‬
‫‪ addrlen‬طول استراکچر ‪ addr‬را بر حسب بایت مشخص میکند‬
‫‪‬‬
‫توابع )(‪ send‬و )(‪recv‬‬
‫این دو تابع در برنامه سمت سرویس دهنده و مشتری یکسان بکارمیرود‪:‬‬
‫)‪Int send ( int sockfd , const void *msg , int len , int flags‬‬
‫) ‪Int recv ( int sockfd , void *buf , int len , unsigned int flags‬‬
‫‪ Sockfd‬مشخصه سوکتی است که از تابع )(‪ accept‬بدست آمده‬
‫‪ msg‬این پارامتردرتابع )(‪ ،send‬آدرس محلی درحافظه که داده های ارسالی از‬
‫آنجا استخراج و داخل فیلد داده قرار گرفته و ارسال میشود را مشخص میکند ‪.‬‬
‫‪ len‬طول داده های ارسالی یا دریافتی بر حسب بایت را تعیین میکنید‪.‬‬
‫‪ flag‬بدون توضیح فقط درآن صفربگذارید‪.‬‬
‫‪ buf‬این پارامتر در تابع )(‪ ،recv‬آدرس محلی درحافظه که داده های دریافتی‬
‫درآنجا ست و به برنامه بازگردانده میشود‬
‫‪‬‬
‫نکاتی مربوط به توابع ()‪ send‬و)(‪recv‬‬
‫‪ )1‬این دو تابع فقط برای ارسال و دریافت روی سوکتهای نوع استریم کاربرد‬
‫دارد‪.‬‬
‫‪ )2‬مقدار برگشتی این دو تابع در صورت خطا ‪ -1‬خواهد بود ولی در صورتی که‬
‫مقدار برگشتی عددی مثبت باشد تعداد بایتهای ارسالی یا دریافتی را مشخص‬
‫میکند‪.‬‬
‫‪ )3‬در هر مرحله سعی کنید حجم داده ها ارسالی توسط تابع )(‪ send‬تقریبا ً یک‬
‫کیلو بایت باشد‪.‬‬
‫توابع )(‪ close‬و )(‪: shutdown‬‬
‫‪‬‬
‫با استفاده از این دو تابع میتوانید بعد ازاتمام نیازارتباط یا اتصال ‪ TCP‬را ببندید‬
‫; )‪Close (sockfd‬‬
‫‪ Sockfd ‬مشخصه سوکتی است که میخواهید آن را ببندید دقت کنید این سوکت‬
‫همان مشخصه ای است که توسط تابع )(‪ accept‬برگشته اگر سوکتی باشد که‬
‫توسط تابع )(‪ socket‬برگشته تمام ارتباطات معلق بسته میشود و امکان ارتباط به‬
‫کل قطع میشود‬
‫سوکتی که توسط تابع )(‪ close‬بسته میشود دیگربرای ارسال و دریافت قابل استفاده‬
‫نیست و سیستم عامل میتواند به جای آن تقاضای اتصال دیگری را قبول کند‬
‫‪‬‬
‫راه دیگر بستن یک سوکت تابع)(‪ shutdown‬است‪:‬‬
‫;)‪Int shutdown( int sockfd , int how‬‬
‫‪‬‬
‫‪ how‬روش بستن سوکت که یکی از مقادیر زیر است‪:‬‬
‫الف) مقدار صفر دریافت داده را غیرممکن میکند ولی سوکت برای ارسال داده‪،‬‬
‫همچنان باز است‪.‬‬
‫ب ) مقدار یک ارسال داده را غیرممکن میکند ولی سوکت برای دریافت داده‪،‬‬
‫همچنان باز است‪.‬‬
‫ج ) مقدار دو ارسال و دریافت را غیرممکن میکند سوکت کامالً بسته میشود(‬
‫مانند تابع )(‪) close‬‬
‫توابع قابل استفاده در برنامه مشتری مبتنی بر سوکتهای استریم‬
‫‪‬‬
‫تابع )(‪ connect‬برای برقراری ارتباط برنامه ی مشتری با یک سرویس دهنده‬
‫از تابع )(‪ connect‬استفاده میشود ‪ ،‬این تابع فرمان شروع ”دست تکانی سه‬
‫مرحله ای“ است‬
‫;)‪int connect ( int sockfd , struct sockaddr *serv_addr, int addrlen‬‬
‫‪‬‬
‫‪‬‬
‫‪ Serv_addr‬یک استراکچر که آدرس ‪ IP‬ماشین مقصد و آدرس پورت برنامه‬
‫ی مقصد تعیین میشود‬
‫‪ addrlen‬اندازه استراکچر قبلی را بر حسب بایت معرفی میکند‬
‫ارسال و دریافت با سوکتهای دیتاگرام‬
‫‪‬‬
‫ارسال و دریافت به روش ‪ UDP‬روی سوکتهای نوع دیتاگرام‪:‬‬
‫الف) با فراخوانی تابع )(‪ socket‬یک سوکت از نوع دیتاگرام مشخص میشود ‪.‬‬
‫ب ) با تابع )(‪ bind‬به سوکت ایجاد شده آدرس پورت مورد نظر داده میشود‪.‬‬
‫ج ) این مرحله منتظر دریافت داده میشود و سپس امکان ارسال داده فراهم میگردد‪،‬‬
‫دریافت و ارسال داده توسط توابع)(‪ recvfrom‬و )(‪ sendto‬انجام میشود و تنها‬
‫تفاوت آن با سوکتهای استریم است‪.‬‬
‫د ) در پایان سوکت را میبندیم ‪.‬‬
‫‪‬‬
‫تابع )(‪ sendto‬شکل کلی این تابع‪:‬‬
‫‪int send to ( int sockfd, const void *msg , int len, unsigned int flags ,‬‬
‫;)‪const struct sockaddr *to, socklen_t tolen‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪ sockfd‬مشخصه سوکت دیتاگرام که با تابع )(‪ socket‬بوجود آمده‪.‬‬
‫‪ msg‬آدرس محل قرارگرفتن پیام درحافظه که داده های ارسالی ازآنجا‬
‫استخراج و داخل یک بسته ‪ UDP‬قرارگرفته وارسال شود‪.‬‬
‫‪ len‬طول پیام ارسالی را بر حسب بایت را تعیین میکنید‪.‬‬
‫‪ to‬استراکچری از نوع ‪ sockaddr‬که باید آدرس ‪ IP‬مربوط به ماشین‬
‫مقصد و شماره پورت سرویس دهنده تنظیم شود‪.‬‬
‫‪ tolen‬طول استراکچر قبلی بر حسب بایت است‪.‬‬
‫‪‬‬
‫تابع )(‪ recvfrom‬شکل کلی این تابع‪:‬‬
‫‪int recvfrom ( int sockfd, void * buf , int len , unsigned int flags ,‬‬
‫;)‪struct sockaddr *from , int *fromlen‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪ Buf‬آدرس محلی ازحافظه که سیستم عامل داده های دریافتی را درآن محل‬
‫قرارخواهد داد‪.‬‬
‫‪ from‬استراکچری ازنوع ‪ sockaddr‬است که سیستم عامل آن را با‬
‫مشخصات آدرس ‪ IP‬وآدرس پورت برنامه مبدا تنظیم و برمیگرداند تا بدانید با‬
‫چه پروسه ای طرف هستید!‬
‫‪ len‬طول پیامی که باید دریافت شود‪.‬‬