موضوع مقاله: سوکت‌های برکلی | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # سوکت‌های برکلی | مقدمه: انگشتی|چپ|نمودار گردشی سوکت‌های TCP سوکت‌های برکلی یا سوکت‌های بی‌اس‌دی کتاب‌خانه‌ای شامل رابط‌های برنامه‌نویسی نرم‌افزار برای کار با سوکت‌های اینترنتی و سوکت‌های دامنه یونیکس است، که از این سوکت‌ها برای ارتباطات بین پردازشی استفاده می‌شوند. | ## بخش 1: سوکت‌های برکلی | سوکت‌های برکلی به عنوان رابط برنامه‌نویسی نرم‌افزار از سیستم‌عامل ۴/۲بی‌اس‌دی سرچشمه گرفتند که این سیستم‌عامل در سال ۱۹۸۳ منتشر شد. امروزه تمام سیستم‌عامل‌های مدرن یک پیاده‌سازی از سوکت‌های برکلی را به همراه دارند چون این سوکت‌ها روش استاندارد برای دسترسی به اینترنت هستند. این رابط‌ها در اصل به زبان سی نوشته شدند اما بیشتر زبان‌های برنامه‌نویسی رابط‌های مشابهی را در دسترس کاربر قرار می‌دهند و می‌توان از آن‌ها در اکثر زبان‌های برنامه‌نویسی مدرن استفاده کرد. البته در پیاده‌سازی‌های مختلف، این فایل‌ها کمی در نام و محتوا با هم متفاوت هستند. اما به‌طور کلی این فایل‌های سرآیند به شرح زیر هستند: <sys/socket.h> توابع و ساختمان داده‌های اصلی مرتبط با سوکت‌ها در این فایل تعریف شده‌است. این دسته از آدرس‌ها برای برقرای ارتباط میان برنامه‌های موجود بر روی یک سیستم استفاده می‌شوند و از آن‌ها در شبکه استفاده نمی‌شوند. <netdb.h> حاوی توابعی برای ترجمه کردن اسامی پروتکل‌ها و میزبان‌ها به معادل عددی آنهاست. چرا که این اطلاعات قرار است بر روی شبکه ارسال شوند و هر ماشینی هم روش مخصوص به خود را برای پردازش داده‌های موجود در این فیلدها را دارد و بنابراین این فیلدها باید به صورت استاندارد بر روی شبکه ارسال شوند تا از تداخل جلوگیری شود. listen این تابع سوکت مورد نظر را آماده پذیرش اتصالات ورودی می‌کند و به این ترتیب سرویس‌گیرنده‌ها می‌توانند به سیستم متصل شوند. | ## بخش 2: سوکت‌های برکلی | connect این تابع در سمت سرویس‌گیرنده استفاده می‌شود و یک شماره پورت تصادفی به سوکت اختصاص داده و سعی در برقراری ارتباط با سرویس‌دهنده می‌کند. این تابع یک اتصال راه دور که از طرف یک سرویس‌گیرنده آغاز شده را پذیرفته و یک سوکت جدید (برای هر اتصال) برمی‌گرداند که از طریق این سوکت جدید می‌توان با سرویس‌گیرنده ارتباط برقرار کرد. این فراخوان سیستمی یک سوکت جدید ایجاد کرده و یک توصیف‌گر فایل به آن سوکت برمی‌گرداند. معمولاً مقدار این پارامتر با صفر مقدار دهی می‌شود تا پروتکل پیشفرض به صورت خودکار انتخاب شود. این تابع در هنگام شکست مقدار -۱ را برمی‌گرداند و در صورت موفقیت هم یک توصیف‌گر فایل به سوکت مورد نظر برمی‌گرداند که از نوع عدد صحیح است. قبل از اینکه سوکت بتواند برای پذیرش درخواست‌های سرویس‌گیرنده‌ها استفاده شود، باید با استفاده از bind یک آدرس دلخواه را به آن اتصال داد. اگر سوکت با موفقیت به آدرس مورد نظر مرتبط شد، عدد ۰ و در غیر این صورت عدد -۱ برمی‌گردد. وقتی که یک اتصال مورد پذیرش قرار گرفت، از صف حذف می‌شود تا فضای کافی برای اتصالات جدید به وجود آید. فراخوان accept یکی از درخواست‌های موجود در صف listen را پذیرفته و یک توصیف‌گر پرونده جدید برمی‌گرداند که این توصیف‌گر پرونده، علاوه بر توصیف‌گری است که برنامه در حال گوش فرادادن به آن است. | ## بخش 3: سوکت‌های برکلی | به این ترتیب، برنامه می‌تواند هم‌زمان از طریق یک توصیف‌گر درخواست‌های جدید را بپذیرد و برای ارتباط با هر کلاینت هم یک توصیف‌گر مجزا خواهد داشت. این فراخوان سه پارامتر دارد: sockfd: توصیف‌گر سوکتی که برنامه از طریق آن مشغول گوش فرادادن به درخواست‌ها است. پس از اینکه تابع accept برگشت، این پارامتر تغییر می‌کند و مشخص می‌کند ک عملاً چند بایت از ساختار مورد نظر استفاده شده‌است. مقدار برگشتی تابع accept در صورت موفقیت، یک توصیف‌گر پرونده است که برنامه از طریق آن می‌تواند با کلاینت ارتباط برقرار کند. در صورت شکست، مقدار -۱ برمی‌گردد و متغیر سراسری errno هم با کد خطای مورد نظر مقداردهی می‌شود. این تابع در صورت موفقیت مقدار ۰ و در صورت شکست مقدار -۱ را برمی‌گرداند و متغیر errno را کد خطای مناسب مقداردهی می‌کند. اگر اجرای این تابع با شکست مواجه شود، برنامه‌های پورتابل می‌بایست بلافاصله توصیف‌گر پروندهٔ مورد استفاده را ببندند. | ## جمع‌بندی | چون این تضمین وجود ندارد که توصیف‌گر مورد نظر پس از شکست خوردن connect قابل استفادهٔ مجدد باشد.