PDA

مشاهده نسخه کامل : استفاده از UDP در VB.Net



ravegoat
18-02-10, 18:33
UDP يه پروتكل انتقال اطلاعات تحت شبكه هستش. UDP در كليت پارامتر ها شبيه به TCP هستش ولي دو تفاوت عمده با اون داره:
1-تقريبا" UDP سه برابر سريع تر از TCP عمل مي كنه.
2-انتقال داده در UDP با اطمينان كم تري نسبت به TCP صورت مي گيره. يعني اگر اطلاعات با UDP منتقل بشه نمي توانيم 100% مطمئن باشيم كه اطلاعات به مقصد رسيده.

براي همين از UDP در جاهايي استفاده مي كنند كه سرعت انتقال نسبت به ارزش داده ارجحيت داره. مثل تبادل اطلاعات بين رهياب GPS و اپراتور رايانه اي.

قبلا" ذكر كرده بوديم در .Net براي ارتباطات تحت شبكه TCP سه راه متداول وجود داره: كلاس Net و سوكت ، كلاس Remoting و كامپوننت Winsock .
Winsock در حد اندازه هاي دات نت نيست پس ازش صرف نظر مي كنيم. بهترين گزينه كلاس Remoting هستش كه خيلي راحت ارتباط رو برقرار مي كنه. تا اونجايي كه من تحقيق كردم، مجموعه Remoting از UDP پشتيباني نمي كنه.:1. (28):
پس به سراغ كلاس Net و Socket ميريم. شماره گذاري پورت هاي UDP مثل TCP انجام مي شه.
در كلاس Net بايد يكي از طرفين ارتباط روي يك پورت udp مشخص به حالت شنود قرار داده بشه و طرف دوم ارتباط با دونستن ip ماشين شنود، به پورت udp مشخص شده وصل شه و داده ها را ارسال كنه.
اما مشكلي در اين حالت وجود داره:
هنگامي كه برنامه با دستورات كلاس Net به حالت شنود روي يك پورت منتظر مي مونه، رابط گرافيكي برنامه هنگ مي كنه. برجلوگيري از بروز چنين مشكلي بايد فرآيند شنود را در يك ريسمان قرار داد. در مورد ريسمان بندي يا نخ كشي قبلا" توضيح داده بوديم. بهره گيري مناسب از مجموعه Threading باعث مي شه بر مشكل فوق غلبه كنيم.

بهتره اين چند نكته را به خاطر داشته باشيم:
* اطلاعات روي UDP به صورت بايت منتقل مي شود. براي ارسال داده متني بايد يه مبدل رشته <> بايت با استاندارد مناسب در طرفين ارتباط به كار گرفته بشه.

* شما مي توانيد برنامه شنود رو طوري طراحي كنيد كه از IP و Port مشخصي داده دريافت كنه.

* پس از هر بار دريافت به طور پيش فرض ماشين گيرنده از وضعيت دريافت خارج ميشه. براي دريافت مداوم ميشه از يه حلقه بي پايان استفاده كرده كه ماشين رو در وضعيت دريافت نگه داره. چون اين حلقه درون يه ريسمان جريان داره مشكل هنگ كردن رخ نميده. توجه داشته باشيم كه خروج از وضعيت دريافت الزاما" به معناي بسته شدن پورت نيست بلكه براي بسته شدن پورت بايد از دستور Close Connection استفاده كنيم. البته در بحث كنترل ارتباط udp از روش هاي زمان بندي و timeout هم به خوبي ميشه بهره برد.


براي آشنايي بهتر شما دوستان با اين بحث يك سورس كامل VB.Net 2008 ضميمه شده است.

اين برنامه با نام Online Plotter شامل دو بخش هستش: يكي بخش سرور كه وظيفه شنود رو بر عهده داره و ديگري بخش كلاينت كه مختصات رو ارسال مي كنه. سرور با دريافت مختصات از سوي كلاينت آن ها رو يك نقشه مجازي با كلاس گرافيك دات نت نمايش ميده. چون مختصات به صورت اعداد انگليسي هستش از استاندارد ASCII براي Encoding استفاده شده. يه حلقه Do...Loop هم باعث ميشه سرور پس از هر دريافت منتظر داده بعدي باشي. ريسمان دريافت هم با مقادير ThreadState كنترل ميشه تا همه چيز حساب شده پيش بره.

سوال يا مشكلي بود در خدمتم
آرمين:11():