430 likes | 748 Views
مهندسی اینترنت فصل 7. به نام خدا. مقدمه. در این فصل اصول کلی برنامه نویسی شبکه و مفهوم ”برنامه نویسی سوکت“ ( (socket programming را مورد بررسی قرار می دهیم با مثال های ساده، روش نوشتن برنامه های کاربردی تحت پروتکل TCP/IP را تشریح خواهیم کرد
E N D
مقدمه • در این فصل اصول کلی برنامه نویسی شبکه و مفهوم ”برنامه نویسی سوکت“ ((socket programmingرا مورد بررسی قرار می دهیم • با مثال های ساده، روش نوشتن برنامه های کاربردی تحت پروتکل TCP/IP را تشریح خواهیم کرد • در حقیقت این فصل نقطه آغازی است برای تمام برنامه نویسانی که برنامه کاربردی تحت شبکه اینترنت مینویسند
سنگ بنای تمام برنامه های کاربردی لایه چهارم، مفهومی به نام سوکت است • این مفهوم توسط طراحان سیستم عامل یونیکس به منظور برقرای ارتباط برنامه های تحت شبکه و تبادل جریان داده بین پروسه ها ابداع شده. • (( در دنیای یونیکس هر چیزی می تواند به صورت یک فایل تلقی و مدل شود))
تمام عوامل وانواع ورودی وخروجی ها میتوانند توسط سیستم فایل مدل شوند بنابراین تمام عملیاتی که برنامه نویس برای بکارگیری دستگاههای مختلف باید بداند یکسان و ساده و شفاف است • اگر ساختار فایل را برای ارتباطات شبکه ای تعمیم بدهیم آنگاه برای برقراری ارتباط بین دوبرنامه روی کامپیوترهای راه دور روال زیر توضیح داده شده :
الف)از سیستم عامل بخواهید تا شرایط را برای برقراری یک ارتباط با کامپیوتری خاص( با آدرس IP مشخص) و برنامه ای خاص روی آن کامپیوتر ( با آدرس پورت مشخص) فراهم کند یا سوکتی را بگشاید • اگراین کارموفقیت آمیز بود سیستم عامل برای شما یک اشاره گر بر میگرداند ودرغیراین صورت طبق معمول مقدار پوچ ( NULL ) را برمیگرداند
ب) در صورت موفقیت آمیز بودن مرحله ی قبل میتوانید با توابع send() یا write()و recv() یا read() درون یک فایل بنویسید یا بخوانید • ج) پس از اتمام عملیات مبادله ارتباط را همانند یک فایل معمولی ببندید ( با تابع close()) • برای اینکه یک اشاره گر سوکت را از سیستم عامل طلب کنید تا مقدمات ارتباط برقرار شود بایستی تابع سیستمی socket() را در برنامه خود صدا بزنید درصورتی که عمل موفقیت آمیز بود، یک اشاره گر غیر پوچ بر میگرداند
از این پس هرگاه از“ سوکت باز“ یا مبادله داده بر روی سوکت یاد کردیم، منظوراشاره به یک ارتباط بازیا مبادله ی اطلاعات بین دونقطه TSAP روی دو ایستگاه شبکه است • TSAP : Transport Service Access Point یک پروسه و یا در واقع یک برنامه در حال اجرا روی سیستم را مشخص میکند در یک برنامه تحت شبکه همانند فایل ها نیز میتوان همزمان چندین ارتباط فعال و باز بین چندین پروسه داشت و با مشخصه ی هر یک از این ارتباطها روی هر کدام از آنها مبادله داده انجام داد
انواع سوکت و مفاهیم آنها • سوکتهای نوع استریم که سوکتهای اتصال گرا 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)برنامه ایست که بنابر نیاز اقدام به درخواست اطلاعات میکند، تعداد مشتری ها روی ماشین های متفاوت یا حتی روی یک ماشین میتواند زیاد باشد ولی معمولاً تعداد سرویس دهنده ها( برروی یک ماشین واحد یا سرویس مشابه ) یکی است برای مثال: جلسه پرسش و پاسخ با یک نفر صاحب اطلاعات
تقاضای یک یا چند آیتم اطلاعات SERVER Client آیتم های بازگشتی تعامل بین سرویس دهنده مشتری Client/ Server
عملیات در سمت Server : • الف) یک سوکت راکه مشخصه یک ارتباط است بوجود آورید ، با این کار به سیستم عامل اعلام کردیم که نیازمند یک ارتباط هستیم و نوع ارتباط درخواستی خود را (TCP , UDP) معرفی میکنید این کار در محیط سیستم عامل یونیکس و تقریبا تمام سیستمهای عامل توسط تابع سیستمی Socket() انجام میشود. • ب)به سوکت باز شده یک آدرس پورت (آدرس سرویس دهنده) نسبت بدهید این کار توسط تابع سیستمی bind() انجام میشود، بنابراین به سیستم عامل اعلام میکنید که تمام بسته های TCP (یاUDP )را که آدرس پورت مقصدشان با شماره مورد نظر شما مطابقت دارد، به سمت برنامه شما هدایت کند. ”دقت کنید! در برنامه سمت سرویس دهنده استفاده از دستور Bind() الزامی است.“
ج) دراین مرحله شروع پذیرش تقاضاهای اتصال TCP را به سیستم عامل اعلام میکنید این کار توسط تابع سیستمی listen() انجام میشود وچون ممکن است تعداد تقاضاهای اتصال متعدد باشد باید تعداد ارتباط TCP را که میتوانید پذیرای آن باشید، تعیین کنید چرا که سیستم عامل برای پذیرش ارتباطات TCP فضا ومنابع درنظرمی گیرد و باید این تعداد کمتر از مقداری باشد که سیستم عامل به عنوان حداکثر تعیین کرده. • د) با استفاده از تابع Accept() از سیستم عامل بخواهید یکی از ارتباطات معلق را به برنامه شما معرفی کند • ه) از دستورات send() و recv() برای مبادله داده استفاده کنید • و) نهایتاً ارتباط را خاتمه دهید: قطع ارتباط دوطرفه ارسال و دریافت ( Close() ) قطع ارتباط یکی از عملیات ارسال یا دریافت (Shutdown())
Socket() Bind() برنامه ی سمت Client برنامه ی سمت Server Listen() Socket() تکرار دائم Connection request Connect() Accept() Fork() Fork / Thread ادامه پذیرش ایجاد پروسه ی فرزند
تکراربه دفعات مورد نیاز send() تکراربه دفعات مورد نیاز request recv() Process…. send() response resv() Close() سرویس دهنده فرزند close()
عملیات در سمت Client : • الف)یک سوکت را که مشخصه یک ارتباط است، بوجود می آوریم بنابراین به سیستم عامل اعلام شده است که نیازمند تعریف یک ارتباط هستید • ب) در این مرحله احتیاجی به استفاده از دستورBind() نیست زیرا برنامه سمت مشتری منتظر تقاضای ارتباط از دیگران نیست بلکه خودش متقاضی برقراری ارتباط با یک سرویس دهنده است بنابراین در صورت نیاز تقاضا را با استفاده از تابع سیستمیconnect() به سمت آن سرویس دهنده بفرستید این دستور متولی انجام مراحل دست تکانی سه مرحله ای در برقراری یک ارتباط TCP است اگرعمل Connect() موفقیت آمیز بود به معنای موفقیت در برقراری یک ارتباط TCP با سرویس دهنده است
ج) از توابع send() وrecv() برای ارسال یا دریافت داده ها(به هر تعداد) اقدام نمایید • د) ارتباط را با توابع close() یا shutdown() به صورت دوطرفه یا یک طرفه قطع نمایید تاکید: از تابع bind() زمانی استفاده میشود که پذیرای ارتباطات TCP با شماره پورت خاصی باشید و چون برنامه سمت مشتری آغازکننده ارتباط است شماره ی پورت مورد نیاز به طور خودکار سیستم عامل انتخاب و به پروسه منتسب میشود
ساختمان داده های مورد نیاز در برنامه نویسی مبتنی بر سوکت • اولین نوع داده ، ” مشخصه سوکت “ یا Socket Descriptor است ،که برای ارجاع به یک ارتباط باز مورد استفاده قرار میگیرد مشخصه سوکت یک عدد صحیح دوبایتی است • دومین نوع داده برای ایجاد سوکت، یک استراکچراست که آدرس پورت پروسه و همچین آدرس IP ماشین طرف ارتباط را در خود نگه میدارد int a ; Struct sockaddr Unsigned short sa_family ; // Address family Char sa_data 14 ; //14 byte of protocol address ;
sa_familyاین فیلد خانواده یا نوع سوکت را مشخص میکند در حقیقت این گزینه تعیین میکند سوکت مورد نظررا درچه شبکه ای و روی چه پروتکلی بکار خواهید گرفت، بنابراین در سیستمی با پروتکل و سوکت های متفاوت نوع سوکت باید تعیین شود در این فصل شبکه اینترنت با پروتکل TCP/IP است و خانواده سوکت را با ثابت AF_INET مشخص می کنیم. • sa_dataاین چهارده بایتمجموعه ای است از آدرس پورت، آدرس IP و قسمتی اضافی که باید با صفر پر شود )) در شبکه اینترنت آدرس IP چهاربایتی و آدرس پورت دو بایتی است)(
Struct sockaddr_ in short int sin_family ; // Address family unsigned short int sin_port ; // port number Struct in_addr sin_addr ; // Internet address unsigned char sin_zero 8 ; // same size az struct sochaddr ; همانند ساختار قبلی خانواده سوکت را تعیین میکند و sin_family شبکه برای اینترنت مقدار ثابت AF _INET است این فیلد دو بایتی،بایتی آدرس پورت پروسه مورد نظراست sin_port این هشت بایت در کاربردهای مهندسی اینترنت کلا باید مقدار صفر داشته sin_zero 8 باشد زیرا در شبکه اینترنت فعلاً آدرس IP چهار بایتی و آدرس پورت دو بایتی است در حالی که در برخی دیگر از شبکه ها طول آدرس بیشتر است بنابراین جهت استفاده این استراکچر در شبکه اینترنت این هشت بایت اضافی باید با تابعی مانند memset() تماماً صفر شود
// Internet address (a structure for historical reasons) Sin_addrآدرس IP ماشین مورد نظر را مشخص میکند این فیلد خود نیز یک استراکچر است که در حالت کلی عددی صحیح، بدون علامت و چهاربایتی است Struct in_addr Unsigned long s_addr ; // that ’ s a 32 _bit long, or 4 bytes ; این فیلد چهار بایتی ( 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 ; a1 = inet_ntoa ( ina1 .sin_addr) ; // this is 192.168.4.14 a2 = inet_ntoa ( ina2 .sin_addr) ; // this is 10.12.110.57 خروجی address 1: 192.168.4.14 address 2 : 10.12.110.57
توابع مورد استفاده در برنامه سرویس دهنده (مبتنی بر سوکتهای استریم) • تابع socket() فرم کلی آن: Int socket ( int domain , int type , int protocol ) • Domain این پارامتر نشان دهنده خانواده سوکت است و در برنامه نویسی شبکه اینترنت با TCP/IP ، با مقدار ثابت PF_INET تنظیم میشود • Typeبا این پارامتر نوع سوکت را اعلام میکند که میتواند نوع استریم یا از نوع دیتاگرام باشد socket_stream و یا stream_dgram باشد • Protocol در این فیلد شماره شناسایی پروتکل مورد نظرتان را تنظیم میکنید که برای کاربردهای شبکه اینترنت همیشه مقدارآن صفراست • اگر مقدار بازگشتی تابع socket() ، 1- باشد عمل موفقیت آمیزنبوده کارباید متوقف شود ومتغیر سراسری errno() شماره ی خطای رخ داده را برمیگرداند
تابع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 انتخاب وجود دارد بنابراین سیستم عامل یک مشخصه سوکت جدید ایجاد میکند ، سوکت اول توسط تابع socket() ایجاد شده و سوکت دوم توسط تابع accept() به برنامه شما برگشته : الف) سوکت اول شامل مشخصه تمام ارتباطات به صف شده ی منتظر است . ب ) سوکت دوم شامل مشخصه فقط یکی ازاتصالات به صف شده ی معلق است. 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 طول پیامی که باید دریافت شود.