اطلاعیه

Collapse
No announcement yet.

Socket - Socket Programming

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    Socket - Socket Programming



    Socket - Socket Programming چیست ؟

    در ارتباطات شبکه قراردادهایی استفاده می شود تحت عنوان Protocol ,
    پروتکولهای مختلفی ایجاد شده اما در ارتباطات اینترنتی و شبکه هایی که ارتباط ۲ طرفه است
    بیشتر از نوع( TCP/IP ) استفاده میشه که اساس اون به صورت خیلی مختصر اینه که برای هر
    کامپیوتر که به شبکه (که اینترنت هم یه شبکه هستش !!) وصله یه IP مخصوص به خودش رو داره و به نوعی آدرس اون کامپیوتر محسوب میشه که تمام خصوصیات یه آدرس رو که میشه متصور شد داراست .

    اما چرا گفتم در شبکه هایی که ارتباط ۲ طرفه نیازه از ( TCP/IP ) استفاده میشه ؟
    چون انواع دیگری هم از جمله UDP هستند که تقریبا ارتباط یکطرفه میباشد مثلا برای پخش برنامه های رادیویی .
    -----------------------------------------------------------------------------------
    اصلی ترین عامل در یک ارتباط شبکه ای Socket میباشد که اعمال شبکه را بصورت خواندن و
    نوشتن در یک فایل شبیه سازی نموده است . سوکت در اصل مانند یک کانال ارتباطی است
    که میان دو نقطه ایجاد شده و پیغامها رد و بدل میشود.
    برای داشتن یک ارتباط شبکه ای باید یک سوکت ایجاد کنیم ( منظور نرم افزاری هستشا !! )
    که لازمه این کار اینه که بدانیم برای گوش دادن داریم ایجاد میکنیم یا برای فرستادن پیام .
    اگه برای فرستادن پیام باشه که پر واضحه که نیاز به آدرس مقصد داریم . اما این کافی نیست !!!
    امروزه پارتمان نشینی رونق گرفته و تو کامپیوتر هم نفوذ کرده !!!!
    برای فرستادن نامه امروزه تنها آدرس ساختمون طرف کافی نیست و نیاز به شماره واحد اون هو هست .
    این فقط یه تمثیل بود ! درسته تو کامپیوتر هم فقط IP کافی نیست و شماره واحد برنامه ای که گوش به زنگه هم نیازه که به اون Port میگن . یعنی شماره پورت هم نیازه .
    اما یه چیز یادم رفت بگم که IP از ۴ عدد ۰تا۲۵۵ تشکیل شده که با نقطه از هم جدا میشن مثلا : ۱۶۸.۲۳.۵۶.۹۸ یه IP هستش . اما پورت اعدادی بین ۱ تا (بصورت رایج) ۶۵۰۰۰ را میتونه شامل بشه .(بله بزرگتر از این عدد هم میتونه شماره پورت بشه اما چه کاریه !!!)

    اینجا ممکنه یه سوال پیش بیاد که مگه نه اینکه هر کامپیوتر فقط یه IP داره پس یعنی در یه لحظه آیا فقط به یه کامپیوتر میتونه وصل شه ؟؟
    جواب منفی است
    درسته که IP یکی بیشتر نیست اما تعداد معتنابهی پورت داریم
    یعنی با هر پورت به یه کامپیوتر متصل میشیم و میتونیم تا ۶۵۰۰۰ (می دونم بیشتره ;-) ) ارتباط از صدقه سری پورتها داشته باشیم .

    اما اگه سوکت برای گوش دادن باشه تنها کافیه که برای ایجاد سوکت بگیم با چه شماره پورتی می خوایم ایجادش کنیم .
    -----------
    اولین نکته ای که لازمه بگم اینه که تو استفاده از سوکت در اول ایجاد پروژه حتما باید چک باکس مربوط به WinSock رو تیک کنید.

    در برنامه نویسی سوکت ۲ نوع ارتباط خواهیم داشت :

    الف ) در هنگام دریافت یا ارسال پیغام تمام برنامه متوقف می شود که در بسیاری از موارد اصلا مطلوب نیست

    ب) بر اساس Event پایه گذاری می شود که هر موقع پیغامی منتظر دریافت شدن بود آنرا دریافت کند و هر موقع پیغام آماده فرستادن بود آنرا بفرستد و کل برنامه از کار نیافتد که در اکثر موارد این روش استفاده می شود .

    -----------------------------------------------
    تمام نیازهای مارا یک کلاس به نام CAsyncSocket تامین می کند . که با ساختن شئ از آن می توانیم به امکاناتی نظیر send , Receive ,... دسترسی داشته باشیم که مفصلترش رو توضیح خواهم داد . که هرچی بعد از این از توابع اسم میبرم مربوط به این کلاس هستش

    برای این نوع ارتباط که داریم بحث می کنیم ۲ جور سوکت باید بسازیم :

    ۱- برای فرستادن
    ۲- برای گوش دادن یا همون دریافت

    برای ایجاد سوکت از متد;( ) Create استفاده میشه که ۲ نوع آن به این شکل است که :
    ۱
    - برای نوع فرستادن تنها کافیست که این متد بدون پارامتر صدا زده شود : ;( ) Create
    ۲- برای نوع دریافت کردن ۱ پارامتر نیاز دارد و آن شماره پورت برای دریافت کردن میباشد که به طور مثال :;( ۱۷۵۳) Create

    -----------------------------------------------

    بعد از ایجاد سوکت کار بعدی وصل شدن به برنامه مقصد هستش که منتظر دریافت پیغام هستش .
    این کار از جانب فرستنده پیغام شروع میشه که باید متد;( ) Connect صدا زده بشه .
    این متد ۲ پارامتر نیاز دارد :

    ۱- IP کامپیوتر مقصد یا آدرس تحت وب آن مثلا :" www.taraf.com" ( اگر در یک شبکه محلی میخواید وصل بشید اسم کامپیوتر هم میتونه جای IP به کار بره ) که بصورت یه رشته خواهد بود
    ۲- شماره پورت کامپیوتر مقصد که گوش به زنگ هستش

    مثلا : ;(۱۳۶۵,"192.۱68. 12 .39&quotConnect

    ---------------------------------------------------

    اما قبل وصل شدن نیازه که گوش به زنگ بشیم تا بتونیم درخواستهای اتصال رو جواب بدیم برای این کار از متد;( ) Listen بدون هیچ پارامتری استفاده میکنیم تا سوکت دریافت آماده بشه .

    ---------------------------------------------------

    حالا که به اینجا رسیدیم وقتی تقاضای وصل شدن از سمت یه کامپیوتر دیگه به ما میرسه رو باید قبول کنیم :
    گوش به زنگ هستیم که اگه تقاضایی رسید با متد ;( ) Accept قبولش کنیم
    این متد یه پارامتر میگیره و اون یه شئ از کلاس CAsyncSocket هستش که وظیفه دریافت متن پیغامهای بعد از متصل شدن رو به عهده میگیره .

    --------------------------------------------------

    برای فرستادن پیغام از متد ;( ) Send استفاده میکنیم که ۲ پارامتر میگیرد :

    ۱- اشاره گر به بافر داده مورد نظر برای فرستادن است که با استفاده از تابع;(آ‌ ) LPCTSTR استفاده میکنیم که یک پارامتر ورودی دارد و آن متغییری است که پیغام ما در آن است .
    ۲- طول بافر که همان طول پیغام می باشد

    مثلا اگه پیغام در متغییری به نام str باشه به شکل زیر میفرستیم :
    ; (()str.GetLengthو(Send(LPCTSTR(str

    -------------------------------------------------

    وقتی پیغام به گوش دهنده برسه یه Eventبه نام;( ) OnReceive فعال میشه که با متد ;( )Receive پیغام را دریافت می کند که ۲ پارامتر می گیرد :

    ۱- اشاره گر به یک بافر که میتواند یک رشته کاراکتری باشد
    ۲- طول بافر مورد نظر که به چه طولی از پیغام را می خاهیم دریافت کنیم

    بعد از اتمام کار با سوکت باید انرا ببندیم که این کار با متد ;( ) Close صورت میگیرد.

    -------------------------------------------------------------------------------------------------------------------------------
    منبع

    http://pnu-club.com


    با تتشکر از نویسنده متن

    TAHA


    #2
    پاسخ : Socket - Socket Programming

    دست نویسنده درد نکنه.

    چندتا اشکال کوچولو داشت :
    چون انواع دیگری هم از جمله UDP هستند که تقریبا ارتباط یکطرفه میباشد مثلا برای پخش برنامه های رادیویی .
    تفاوت UDP اینه که صحت ارسال بسته ها را چک نمیکنه
    اون چیزی که توی جمله نقل قول شده اومده منظورش از یک طرفه همینه ، یعنی سیستم میتونه بسته را ارسال کنه بدون انتظار از صحت رسیدنش ، بسته بعدی را ارسال کنه
    UDP یک فرق دیگه هم داره ، اونم به علت همین مورد بالا هست ، میتونه روی آدرس
    255.255.255.255 بسته ها راارسال کنه که این آدرس رزرو شده برادکستینگ هست.(انتشار عمومی در رنج ip جاری )

    تعداد پورتها هم 65535 تا هست. معادل integer معمولی
    و معمولا رنج بین 1 تا 1023 را برنامه نویسها به صورت قراردادی استفاده نمیکنند ، چون در اکثر مواقع برنامه های خود سیستم عامل این پورتها را اشغال میکنند و ممکنه تداخل به وجود بیاد.

    موارد بالا در مورد IPV4 هست و برای ipV6 فرق میکنه
    آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
    تا در سفر دوزخ از اين باده بنوشم
    آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
    هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

    دیدگاه


      #3
      پاسخ : Socket - Socket Programming

      فعلا که گیر بازاره!
      پس منم گیر میدم!

      1- صحت ارسال بسته ها حتی در UDP هم میشه چک بشه. چون بسته های IP (لایه پایینی) میتونن با Checksum ردوبدل بشن. غیر از این فرستنده میتونه همراه اطلاعاتی که قراره از طریق UDP ارسال بشه مکانیسم کنترلی خودشو پیاده کنه.
      اما
      سیستم بطور اتوماتیک رسیدن بسته ها رو به فرستنده اعلام نمیکنه و این وظیفه به عهده برنامه کاربردی مربوطه گذاشته شده. بخاطر همین میگن UDP یک پروتک reliable نیست!

      2- ضمنا عدم استفاده از پورتهای زیر 1024 فقط برای جلوگیری از تداخل نیست. در حالت عادی نمیشه دو تا سوکت رو روی یک پورت bind کرد. بنابراین از هر پورت فقط یک سوکت میتونه استفاده کنه و بس. برای چک این مسئله میتونین پورت local سوکتی که دستور accept برمیگردونه رو چک کنین. هیچ وقت این شماره پورت با شماره پورت یک سوکت دیگه مشترک نیست. از طرف دیگه پورت شماره صفر هم کاربرد خاص خودش رو داره. این صفر به معنی (سوکت عوضی) نیست. خیلی جاها معنیش اینه "هر پورتی که شد! مهم نیست چند باشه".

      3- درسته که پروتکل UDP از نوع connection-less هست اما با پیاده سازی های جدید هم میشه پروتکلی مثل TCP رو بطور آسنکرون استفاده کرد. ولی مشخصا همونطوری که همشهریمون گفتن امکان broadscast و multicast مخصوص سوکت های UDP هست. (البته در مقایسه با TCP).

      4- یک طرفه بودن UDP برای ارتباطات رادیویی مهم نیست. یعنی به خاطر یک طرفه بودن کسی نمیاد برای ارتباطات رادیویی استفاده کنه. بلکه مسئله مهمش اینه که اگر یک پاکت از دست رفت پاکت بعدی میتونه اثر از دست رفتن پاکت قبلی رو جبران کنه. میتونین برای این مسئله به پروتکل RTP هم سری بزنین. که برای مقاصد real-time طراحی شده و استفاده میشه.

      5- ایجاد سوکت بسته به این نیست که بگین میفرستیم یا میگیریم. بلکه دید مهمتری وسطه. البته برای پروتکل TCP! و اونم اینه که آیا قراره این سوکت نقش یک واسطه رو ایجاد کنه برای سرویس دهی یا نه. بخاطر همینه که سوکت رو به حالت listen میبریم. چون در این حالت میشه ارجاعات به این سوکت رو در صورت اشغالش (منطقی البته) توسط طرف مقابل به حالت pending نگه داشت. سوکت های UDP که این دردسر رو هم ندارن. اما مسلما زمان پاسخ اونها به درخواست های رسیده و حجم بافر های سیستمی برای خودش گلوگاه مهمی حساب میشه.

      ضمنا بد نیست این جور موارد رو بیشتر باز کنین که حداقل خواننده بفهمه راجع به سوکت ها در چه محیطی و با استفاده از چه کامپایلری بحث میشه.

      دیدگاه


        #4
        پاسخ : Socket - Socket Programming

        با تشکر از دوستان به خاطر اصلاحاتی که انجتم دادن
        یا گیر هایی که دادن :biggrin:

        ولی درکل من رشته ام کامپیوتر نیست به خاطر یکی از پروژهام مجبور شدم یک Socket
        fبنویسم. :read:
        فعلا هم در مراحل اغازین کارهستم :nerd:
        بنابراین اگه اشتباهی در متن یا نوشته های من بود ببخشید :redface:

        دیدگاه


          #5
          پاسخ : Socket - Socket Programming


          - صحت ارسال بسته ها حتی در UDP هم میشه چک بشه. چون بسته های IP (لایه پایینی) میتونن با Checksum ردوبدل بشن.
          خیر ، هر بسته دوتا چکسام داره ، یکی مربوط به هدرIP ( که روی محتوی دیتای پکت نیست ) و یکی مربوط به هدر پروتکل مربوطه که در مورد TCP و UDP بر روی محتوی یا دیتای پکت + هدر خود پروتکل + شبه هدری شامل بعضی مشخصات هدرip محاسبه چکسام جدای از محاسبه هدرip انجام میشه و عملا صحت لایه دیتا و پروتکل UDP را بخاطر صحت هدرip نمیشه گفت معتبر.

          البته منم منظورم از صحت ارسال اطلاعات رسیدن یا نرسیدن پکت بود نه خرابی پکت ، فکر کنم لغت صحت را باید با توضیحات " اطمینان از سالم رسیدن " بکار میردم

          در مورد سالم بودن بسته های دریافتی ، در پروتکل UDP بعد از ارسال چیزی چک نمیشه ( رسیده یا نرسیده ) ، سمت گیرنده هست که وقتی پکتی بهش برسه ، بعد از دریافت چکسام محاسبه میشه.
          برای تضمین صحت ارسال و دریافت بسته ها و تضمین رسیدنشون به دست گیرنده روی پروتکل UDP یک پروتکلی هست بنام UDT
          البته بیشتر برای حجمهای بزرگ که میخوان با سرعت زیاد منتقل بشه استفاده داره
          اطلاعات بیشتر: http://www.codeproject.com/KB/IP/udt.aspx

          چکسام را با قراردادن مقدار0 در پروتکل UDP میتونیم به سیستم عامل حالی کنیم که بیخیالش بشه و در هر حالتی فکر کنه بسته صحیح هست ، ولی در TCP با 0کردن هم این اتفاق نمی افته ( البته در سیستم عامل ویندوز - مگر اینکه بریم به کارت شبکه حالی کنیم بیخیالش بشه و طبق استاندارد اصولی کار کنه



          اون بحث 1تا 1023 همونطور که گفتم یه حالت قراردادیه و اجباری نیست ، ولی ربطی به این موضع که 2تا سوکت نمیتونن یک پورت را بایند کنند نیست ،

          و البته این نکته هم جالبه :
          "در حالت عادی نمیشه دو تا سوکت رو روی یک پورت bind کرد. بنابراین از هر پورت فقط یک سوکت میتونه استفاده کنه و بس"

          درشرایط خاص شما میتونید با استفاده از تابع SetSockOpt و پارامتر SO_REUSEADDR این کار را بکنید :twisted: ، منتها معمولا به این امکان جائی اشاره نمیشه چون در بعضی سیستم عاملهای خیلی قدیمی ، ساپورت نمیشده و در رفرنسها و داکیومنتهای فارسی اللخصوص من تاحالا ندیدم حتی یک خط هم کسی بهش اشاره ای بکنه ( ماشالا همه کپی ، پیست ).
          اطلاعات بیشتر :
          http://msdn.microsoft.com/en-us/library/ms740621(v=vs.85).aspx

          - یک طرفه بودن UDP برای ارتباطات رادیویی مهم نیست. یعنی به خاطر یک طرفه بودن کسی نمیاد برای ارتباطات رادیویی استفاده کنه. بلکه مسئله مهمش اینه که اگر یک پاکت از دست رفت پاکت بعدی میتونه اثر از دست رفتن پاکت قبلی رو جبران کنه.
          پاکت بعدی هیچ وقت نمیتونه اثر قبلی را که از دست رفته جبران کنه ،مگر اینکه قانون انرژی و ماده ، برادران انیشتن و حاجی نیوتن و استاد رازی _ کاشف عزیز الکل _ نقض بشه
          تنها علت استفاده از ارتباطات رادیوئی یا ویدئویی اینه که از دست دادن یک پکت صدا یا تصویر ، خلل زیادی وارد نمیکنه ، برفرض از 24 فریم تصویر که در حالت عادی چشم باید ببینه یکی هم از دست بره ، کاربر اصلا متوجه نمیشه یا توی ارتباط رادیئوی نهایتا یه صدای لحظه ای خش خش کوتاه ممکنه روی بلندگوها بیاد که عملا شنیده نمیشه.
          آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
          تا در سفر دوزخ از اين باده بنوشم
          آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
          هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي

          دیدگاه

          لطفا صبر کنید...
          X