ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 5 از 5
  1. #1
    2009/07/30
    67
    0

    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. #2
    2010/05/01
    اصفهان
    378
    3

    پاسخ : Socket - Socket Programming

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

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

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

    موارد بالا در مورد IPV4 هست و برای ipV6 فرق میکنه
    آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
    تا در سفر دوزخ از اين باده بنوشم
    آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
    هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي
  3. #3
    2008/09/02
    اصفهان
    1,897
    41

    پاسخ : 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. #4
    2009/07/30
    67
    0

    پاسخ : Socket - Socket Programming

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

    ولی درکل من رشته ام کامپیوتر نیست به خاطر یکی از پروژهام مجبور شدم یک Socket
    fبنویسم. :read:
    فعلا هم در مراحل اغازین کارهستم :nerd:
    بنابراین اگه اشتباهی در متن یا نوشته های من بود ببخشید :redface:
  5. #5
    2010/05/01
    اصفهان
    378
    3

    پاسخ : 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 فریم تصویر که در حالت عادی چشم باید ببینه یکی هم از دست بره ، کاربر اصلا متوجه نمیشه یا توی ارتباط رادیئوی نهایتا یه صدای لحظه ای خش خش کوتاه ممکنه روی بلندگوها بیاد که عملا شنیده نمیشه.
    آن دم که مرا مي زده بر خاک سپاريد زير کفنم خمره اي از باده گذاريد
    تا در سفر دوزخ از اين باده بنوشم
    آنلحظه که با دوزخيان کنم ملاقات يک خمره شراب ارغوان برم به سوغات
    هرقدر که در خاک ننوشيدم از اين باده صافي ، بنشينم و با دوزخيان کنم تلافي
نمایش نتایج: از 1 به 5 از 5

موضوعات مشابه

  1. IAP-in application programming
    توسط hunybal در انجمن STM
    پاسخ: 6
    آخرين نوشته: 2018/02/07, 16:29
  2. کتابخانه برای mmc socket ها
    توسط arash_k در انجمن نرم افزار Protel
    پاسخ: 1
    آخرين نوشته: 2015/12/09, 07:23
  3. سئوال: کتابخانه IC Socket چیه؟
    توسط GLinBoy در انجمن نرم افزار Protel
    پاسخ: 1
    آخرين نوشته: 2009/12/17, 15:21
  4. کار با Socket
    توسط Far-Afzun در انجمن برنامه نویسی و اینترفیس
    پاسخ: 0
    آخرين نوشته: 2008/03/12, 21:49
  5. پاسخ: 1
    آخرين نوشته: 2007/06/03, 20:50

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •