دانلود - 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طول پیامی که باید دریافت شود.