PDA

View Full Version : آموزش: برنامه نویسی شبکه به زبان C#.NET



silsin
شنبه 25 آبان 1392, 22:51 عصر
با سلام
اولین فعالیت جدی من در این انجمن رو می خوام با این تاپیک شروع کنم .

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

امیدوارم تاپیک مفیدی بشه و حداقل من بتونم ادامه اش بدم .
فرصت هم شد موضوعات هم رده دیگه رو هم اینجا میاریم .
درضمن اگه تاپیک مشابه هست بهم بگین که بی دلیل این کار رو انجام ندم
با تشکر




فهرست :

مفاهیم : بخش اول (http://barnamenevis.org/showthread.php?428014-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B4%D8%A8%DA%A9%D9%87-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-C-.NET&p=1915225&viewfull=1#post1915225) - بخش دوم (http://barnamenevis.org/showthread.php?428014-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B4%D8%A8%DA%A9%D9%87-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-C-.NET&p=1915628&viewfull=1#post1915628)

مقدمه ای بر برنامه نویسی سوکت
(http://barnamenevis.org/showthread.php?428014-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B4%D8%A8%DA%A9%D9%87-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-C-.NET&p=1915689&viewfull=1#post1915689)

سوکت TCP (http://barnamenevis.org/showthread.php?428014-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B4%D8%A8%DA%A9%D9%87-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-C-.NET&p=1926247&viewfull=1#post1926247)


سوکت های UDP (http://barnamenevis.org/showthread.php?428014-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%B4%D8%A8%DA%A9%D9%87-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-C-.NET&p=1931898&viewfull=1#post1931898)

silsin
شنبه 25 آبان 1392, 23:15 عصر
W = WikiPedia
S = http://www.srco.ir/
مفاهیم :
بخش اول

تعریف شبکه های رایانه ای :
W :
یک شبکه رایانه‌ای (به انگلیسی: Computer Network)‏، که اغلب به طور خلاصه به آن شبکه گفته می‌شود، گروهی از رایانه‌ها و دستگاه‌هایی می‌باشد که توسط کانال‌های ارتباطی به هم متصل شده‌اند. شبکه رایانه‌ای باعث تسهیل ارتباطات میان کاربران شده و اجازه می‌دهد کاربران منابع خود را به اشتراک بگذارند

معرفی

یک شبکه رایانه‌ای اجازه به اشتراک گذاری منابع و اطلاعات را میان دستگاه‌های متصل شده به هم، می‌دهد. در دهه ۶۰ میلادی، آژانس پروژه‌های تحقیقاتی پیشرفته (ARPA)، بودجه‌ای را به منظور طراحی شبکه آژانس پروژه‌های تحقیقاتی پیشرفته (ARPANET) برای وزارت دفاع ایالات متحده آمریکا اختصاص داد. این اولین شبکه رایانه‌ای در جهان بود.[۱] توسعه شبکه از سال ۱۹۶۹ و براساس طرح‌های توسعه یافته دهه ۶۰ آغاز شد.
هدف شبکه‌های رایانه‌ای را می‌توان برای اهداف مختلف استفاده کرد:
تسهیل ارتباطات: با استفاده از شبکه، افراد می‌توانند به آسانی از طریق رایانامه (E-mail)، پیام‌رسانی فوری، اتاق گفت و گو (Chat room)، تلفن، تلفن تصویری و ویدئو کنفرانس، ارتباط برقرار کنند.
اشتراک گذاری سخت افزارها: در یک محیط شبکه‌ای، هر کامپیوتر در شبکه می‌تواند به منابع سخت افزاری در شبکه دسترسی پیدا کرده و از آن‌ها استفاده کند؛ مانند چاپ یک سند به وسیله چاپگری که در شبکه به اشتراک گذاشته شده‌است.
اشتراک گذاری پرونده‌ها، داده‌ها و اطلاعات: در یک محیط شبکه‌ای، هر کاربر مجاز می‌تواند به داده‌ها و اطلاعاتی که بر روی رایانه‌های دیگر موجود در شبکه، ذخیره شده‌است دسترسی پیدا کند. قابلیت دسترسی به داده‌ها و اطلاعات در دستگاه‌های ذخیره سازی اشتراکی، از ویژگی‌های مهم بسیاری از شبکه‌های است.
اشتراک گذاری نرم افزارها: کاربرانی که به یک شبکه متصل اند، می‌توانند برنامه‌های کاربردی موجود روی کامپیوترهای راه دور را اجرا کنند.

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

تعریف دوم :
W : قرارداد ارتباطات یا پروتکل ارتباطات (به انگلیسی: Communications Protocol)‏ در شبکه‌های رایانه‌ای به مجموعه قوانینی اطلاق می‌گردد که نحوهٔ ارتباطات را قانونمند می‌نماید. نقش پروتکل در کامپیوتر نظیر نقش زبان برای انسان است. برای مطالعه یک کتاب نوشته شده به فارسی می‌بایست خواننده شناخت مناسبی از زبان فارسی را داشته باشد. به منظور ارتباط موفقیت آمیز دو دستگاه در شبکه نیز باید هر دو دستگاه از یک پروتکل مشابه استفاده کنند.
در علوم رایانه و ارتباطات، پروتکل عبارت است از استاندارد یا قراردادی که برای ارتباط میان دو ند برقرار می‌شود. پروتکل اتصال بین دو ند، انتقال داده بین آن دو و تبادلات میان را ممکن کرده و آن را کنترل می‌کند. پروتکل در ساده‌ترین حالت می‌تواند به عنوان قوانین ادارهٔ منطق، ترکیب و همزمانی ارتباطات در نظر گرفته شود. پروتکل‌ها ممکن در سخت‌افزار یا نرم‌افزار یا ترکیبی از این دو پیاده سازی شوند. پروتکل در پایین‌ترین سطح رفتار اتصال سخت‌افزاری را تعریف می‌کند. معنی لغوی پروتکل مجموعه قوانین است.

پروتکل tcp :
TCP/IP ، پروتکلی استاندارد برای ارتباط کامپيوترهای موجود در يک شبکه مبتنی بر ويندوز 2000 است. از پروتکل فوق، بمنظور ارتباط در شبکه های بزرگ استفاده می گردد. برقراری ارتباط از طريق پروتکل های متعددی که در چهارلايه مجزا سازماندهی شده اند ، ميسر می گردد. هر يک از پروتکل های موجود در پشته TCP/IP ، دارای وظيفه ای خاص در اين زمينه ( برقراری ارتباط) می باشند . در زمان ايجاد يک ارتباط ، ممکن است در يک لحظه تعداد زيادی از برنامه ها ، با يکديگر ارتباط برقرار نمايند. TCP/IP ، دارای قابليت تفکيک و تمايز يک برنامه موجود بر روی يک کامپيوتر با ساير برنامه ها بوده و پس از دريافت داده ها از يک برنامه ، آنها را برای برنامه متناظر موجود بر روی کامپيوتر ديگر ارسال می نمايد. نحوه ارسال داده توسط پروتکل TCP/IP از محلی به محل ديگر ، با فرآيند ارسال يک نامه از شهری به شهر، قابل مقايسه است .
برقراری ارتباط مبتنی بر TCP/IP ، با فعال شدن يک برنامه بر روی کامپيوتر مبدا آغاز می گردد . برنامه فوق ،داده های مورد نظر جهت ارسال را بگونه ای آماده و فرمت می نمايد که برای کامپيوتر مقصد قابل خواندن و استفاده باشند. ( مشابه نوشتن نامه با زبانی که دريافت کننده ، قادر به مطالعه آن باشد) . در ادامه آدرس کامپيوتر مقصد ، به داده های مربوطه اضافه می گردد ( مشابه آدرس گيرنده که بر روی يک نامه مشخص می گردد) . پس از انجام عمليات فوق ، داده بهمراه اطلاعات اضافی ( درخواستی برای تائيد دريافت در مقصد ) ، در طول شبکه بحرکت درآمده تا به مقصد مورد نظر برسد. عمليات فوق ، ارتباطی به محيط انتقال شبکه بمنظور انتقال اطلاعات نداشته ، و تحقق عمليات فوق با رويکردی مستقل نسبت به محيط انتقال ، انجام خواهد شد .


پروتکل UDP :
S :
UDP) User Datagram Protocol) ، پروتکلی در سطح لایه "حمل" بوده که برنامه مقصد در شبکه را مشخص نموده و از نوع بدون اتصال است . پروتکل فوق، امکان توزیع اطلاعات با سرعت مناسب را ارائه ولی در رابطه با تضمین صحت ارسال اطلاعات ، سطح مطلوبی از اطمینان را بوجود نمی آورد . UDP در رابطه با داده های دریافتی توسط مقصد ، به Acknowledgmentنیازی نداشته و در صورت بروز اشکال و یا خرابی در داده های ارسال شده ، تلاش مضاعفی بمنظور ارسال مجدد داده ها ، انجام نخواهد شد . این بدان معنی است که داده هائی کمتر ارسال می گردد ولی هیچیک از داده های دریافتی و صحت تسلسل بسته های اطلاعاتی ، تضمین نمی گردد .از پروتکل فوق ، بمنظور انتقال اطلاعات به چندین کامپیوتر با استفاده ازBroadcast و یا Multicast، استفاده بعمل می آید . پروتکل UDP ، در مواردیکه حجم اندکی از اطلاعات ارسال و یا اطلاعات دارای اهمیت بالائی نمی بانشد ، نیز استفاده می گردد. استفاده از پروتکلUDP در مواردی همچون Multicasting Streaming media، (نظیر یک ویدئو کنفرانس زنده) و یا انتشار لیستی از اسامی کامپیوترها که بمنظور ارتباطات محلی استفاده می گردند ، متداول است . بمنظور استفاده ازUDP ، برنامه مبداء می بایست پورت UDP خود را مشخص نماید دقیقا" مشابه عملیاتی که می بایست کامپیوتر مقصد انجام دهد . لازم به یادآوری است که پورت های UDP از پورت های TCP مجزا و متمایز می باشند (حتی اگر دارای شماره پورت یکسان باشند ).

تعریف دوم :
W : قرارداد بسته دادۀ کاربر یا پروتکل بسته دادۀ کاربر (به انگلیسی: UDP یا User Datagram Protocol)‏ یکی از اجزاء اصلی مجموعه پروتکل اینترنت، مجموعه‌ای از پروتکل‌های شبکه که در اینترنت مورد استفاده قرار می‌گیرند، می‌باشد. رایانه‌ها با استفاده از UDP قادر به ارسال پیغام، که در این مورد آن را بسته داده یا Datagram می‌نامیم، به دیگر میزبان‌های موجود در پروتکل اینترنت (IP) می‌باشند. این پروتکل توانایی این را دارد که این کار را بدون برقراری ارتباط قبلی و یا ایجاد کانالها یا مسیرهای انتقال داده ویژه انجام دهد. پروتکل مزبور در سال 1980 توسط دیوید پی. رید ابداع گردیده و به طور رسمی در استاندارد RFC 768 تعریف شد.
UDP از مدل انتقال ساده بدون استفاده از تکنیک دست تکانی صریح که برای ایجاد قابلیت اطمینان (Reliability)، مرتب سازی و یکپارچه سازی داده‌ها بکار می‌رود، بهره می‌جوید. بنابراین، UDP سرویس غیرمطمئنی را ارائه می‌دهد و ممکن است بسته داده ها نامرتب، تکراری بوده و یا بدون اطلاع قبلی از دست بروند. UDP تشخیص می‌دهد که بررسی خطا و تصحیح آن با توجه به نوع کاربردی که دارد لازم نبوده و یا نباید اجرا شود، بنابراین چنین بار اضافی پردازشی را بر شبکه تحمیل نمی‌کند. برنامه‌های که نسبت به زمان حساس هستند از UDP استفاده می‌کنند، زیرا از دست دادن بسته‌ها بهتر از منتظر ماندن برای بسته هاست. بنابراین پروتکل UDP بهترین گزینه برای سیستم‌های بلادرنگ به حساب می‌آید. اگر برنامه‌ای نیاز به امکانات تصحیح خطا در سطح واسط شبکه داشته باشد، می‌تواند از قرارداد کنترل انتقال (به انگلیسی: TCP یا Transmission Control Protocol)‏ و یا پروتکل انتقال کنترل جریان (به انگلیسی: SCTP یا Stream Control Transmission Protocol)‏ استفاده کند که به طور خاص برای این منظور طراحی شده‌اند.
طبیعت [[پروتکل‌های بدون حالت|بدون حالت}} UDP می‌تواند برای سرورهایی که به پرس و جوهای کوچک حجم زیادی از کلاینت‌ها پاسخ می‌دهند نیز مفید واقع شود. UDP بر خلاف TCP، با شبکه‌های پخشی (انتشار بسته در کل شبکه محلی) و شبکه‌های چندپخشی (ارسال بسته به بخشی از شبکه) سازگاری کامل دارد.
برنامه‌های معمول شبکه که از UDP استفاده می‌کنند عبارتند از: سامانه نام دامنه (به انگلیسی: DNS یا Domain Name System)‏، برنامه‌هایی که از پخش زنده یا رسانه جویباری (Streaming Media) استفاده می‌کنند نظیر تلویزیون پروتکل اینترنت یا IPTV، صدا روی پروتکل اینترنت یا VoIP، پروتکل ساده انتقال فایل (به انگلیسی: TFTP یا Trivial File Transfer Protocol)‏ و بسیاری از بازی‌های برخط.



IP یا پروتکل اینترنت :

W :قرارداد اینترنت یا پروتکل اینترنت مهمترین قراردادی است که برای مبادله اطلاعات در شبکه‌های اینترنتی وجود دارد. این قرارداد بنیادی‌ترین قرارداد شکل‌دهنده اینترنت می‌باشد[نیازمند منبع] و وظیفه مسیردهی بسته‌های اطلاعاتی را در گذر از مرزهای شبکه‌ها به عهده دارد. پروتکل اینترنت یک پروتکل لایه‌ای است که در نرم‌افزار داخلی استفاده می‌شود و در لایه ارتباط (Link) قرار می‌گیرد. آی‌پی در شرایط پروتکل لایه‌ای پایین می‌تواند خدمات جهانی دسترسی را بین کامپیوترها ارائه کند.


HTTP :
منشور انتقال ابرمتن (به انگلیسی: Hypertext Transfer Protocol)‏ (مخفف انگلیسی: HTTP) یک پروتکل لایهٔ کاربرد (Application Layer) برای سیستم‎های توزیع شده می‎باشد. این پروتکل عمومی علاوه بر استفاده اصلی آن در ابرمتن‎ها در بسیاری از زمینه‎های دیگر کامپیوتری مانند سامانهٔ نام دامنه (DNS) قابل استفاده است. از نسخه اولیه، این پروتکل در وب جهانی استفاده می‎شد و آخرین به‎روز رسانی آن در ماه جون ۱۹۹۹ تحت عنوان «HTTP/1.1» صورت گرفت.
گسترش این پروتکل بر عهدهٔ نیروی ضربت مهندسی اینترنت (IETF) و کنسرسیوم وب جهان‌شمول (W3C) می‎باشد. این امر در گروه کاری پروتکل انتقال ابرمتن (HTTP Working Group) صورت می‎گرد.

silsin
یک شنبه 26 آبان 1392, 14:37 عصر
مفاهیم بخش دوم :

کلاینت / سرور : در مقایسه با سرویس پستی و سیستم تلفن داخلی هر مخابره با یک عامل شروع میشود که نامه ای را ارسال می کند یا شماه تلفن را برای برقراری تماس می گیرد در حالی که عامل دیگر از طریق نامه یا گرفتن گوشیِ تلفن پاسخ می دهد . مخابره اینترنتی نیز همین طور است . واژه های سرویس گیرنده و سرویس دهنده به این نقش ها اشاره می کنند . برنامه سرویس گیرنده مخابره را اغاز می کند در حالی که برنامه سرویس دهنده منتظر آن است و به ان مخابره پاسخ می دهد . سرویس دهنده و سرویس گیرنده روی هم یک کاربرد ایجاد می کنند . واژه های سرویس گیرنده و سرویس دهنده بیان گر این است که سرویس دهنده دارای سرویس هایی است و سرویس گیرنده از آن استفاده می کند


مفهوم آدرس ها :
وقتی نامه ای را به دوت خود ارسال می کنید ادرس گیرنده را روی پاکت می نویسید تا سرویس پست بفهمد که نامه باید به چه کسی ارسال شود . قبل از این که با کسی از طریق تلفن صحبت کنید باید شماره اورا بگیرید . به طور مشابه قبل از این که برنامه ایبتواند با برنامه دیگری مخابره کند باید به شبکه بگوید که برنامه مقصد در کجا قرار دارد . در tcp / ip دو قطعه اطلاعات برای مشخص کردن یک برنامه به کار می رود . ادرس اینترنت که توسط ip استفاده می شود و شماره پورت که ادرس دیگری است که توسط پروتکل tcp یا udp تفسیر می شود.


سوکت :
سوکت , انتزاعی است که یک کاربرد را از طریق آن می تواند داده ها را ارسال و دریافت کند همانند یک فایل باز که کاربرد می تواند داده ها را در آن ذخیره و از ان بازیابی کند . سوکت موجب می شود کاربرد یا همان اپلیکشین به شبکه متصل گردد و با کاربرد های دیگری که به آن شبکه متصل هستند مخابره کند . اطلاعاتی که توسط کاربردی در یک ماشین در سوکت نوشته میشود توسط کاربردی در ماشین دیگر قابل خواندن است و برعکس.

سوکت های مجموعه پروتکل TCP/IP به دو دسته تقسیم می شود
سوکت های استریم
سوکت های داده گرام


DNS :

سامانه DNS مخفف عبارت Domain Name System می باشد نظامی سلسله‌مراتبی برای نام‌گذاری رایانه‌ها و دیگر منابعی است که به اینترنت یا شبکه‌های دیگر رایانه‌ای متصل می‌شوند. وقتی می خواهید وارد سایتی شوید ، باید آدرس وب سرور آنرا بدانید. آدرس وب سرور با IP مشخص میشود. اما به خاطر سپردن آدرس IP دشوار است. می توان به جای IP از domin name ها استفاده کرد. برای هر IP یک domin name در نظر گرفته شده است. مثلا IP آدرس گوگل 66.249.91.103 است. که شما برای دسترسی به گوگل میتوانید از ip یا آدرس www.google.com استفاده کنید.
در حقیقت DNS، IP addresses را به اسامی مشخص و ساده ترجمه می کند. مثلا وب سرور سایت yahoo می تواند 65.20.35.79 باشد. ( اعداد IP صرفا برای مثال است.) که می توان از طریق آدرس http://www.yahoo.com هم به آن دسترسی پیدا کرد.
هم domain name و هم IP address، کاربر را به یک وب سرور مشخص هدایت می کند ، اما domain name، هم برای استفاده ، و هم برای به خاطر سپردن به مراتب راحت تر است. بدون DNS کاربرها مجبور هستند برای وارد شدن به هر بخشی از اینترنت از اعداد خسته کننده IP address استفاده کنند.

silsin
یک شنبه 26 آبان 1392, 16:14 عصر
مقدمه ای بر برنامه نویسی سوکت
بخش اول :
یکی از امتیازات زبان برنامه نویسی C#‎‎‎‎ استفاده از محیط کاری دات نت است که کتاب خانه قدرتمندی از API را برای برنامه نویسی فراهم می کند. از بین کتاب خانه های کلاسی که ارائه شده اند فضاهای نام (namespace)
System.Net و System.Socket برای برنامه نویسی سوکت به کار می رود . ما برای بخش برنامه نویسی شبکه یا همون برنامه نویسی سوکت در اینجا از API های موجود در این دو کتاب خانه استفاده خواهیم کرد .

بررسی چند کلاس :
برای اینکه اولین برنامه را در مورد سوکت ها بنویسیم که بتواند آدرس های میزبان ها را تعیین نماید . کلاس های ipaddress , Dns , IPHostEntry نیاز داریم . لذا به شرح مختصری از این سه کلاس خواهیم پرداخت .
عملکرد کلاس ها :
DNS :
کلاس DNS یک راهکار برای جستجو یا تبدیل نام به ادرس تدارک می بیند.
IPHost Entry :
چون در اینترنت مدرن یک سرویس دهنده می تواند از چند ادرس ip یا اسامی مستعار استفاده کند نتایج در یک کلاس Container به نام IPHostEntry برگردانده می شود که حاوی آرایه ای از یک یا چند نام میزبان از نوع رشته ای می باشد .
IPAddress :
این کلاس حاوی ادرس واسط بر روی بستر IP می باشد .



بررسی اولین کلاس :
کلاس IPAddress
متدها :
Equals
به وسیله این متد می توان دو نمونه از IPAddress ها را مقایسه کرد و در صورتی که حاوی آدرس IP یکسانی باشد , مقدار true وگرنه مقدار false را بر می گرداند .

مثال :
خروجی کد زیر به خاطر مساوی بودن دو IP برابر با True می شود


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Socket_0_1
{
class Program
{
static void Main(string[] args)
{

Console.Write(IPAddress.Equals(IPAddress.Parse("127.0.0.1"), IPAddress.Parse("127.0.0.1")));

Console.ReadKey();
}
}
}




متد (HostToNetworkOrder و NetworkToHostOrder ):

کامپیوتر های مختلف در اعداد صحیح چند بایتی از ترتیب های متفاوتی از بایت ها استفاده می کنند .بعضی از کامپیوتر ها بایت با ارزش را در ابتدا قرار می دهند (big-endian order)
و بعضی دیگر بایت کم ارزش را در ابتدا قرار می دهند (little-endian order) . برای کار کردن با کامپیوتر هایی که از ترتیب بایت های مختلفی استفاده می کنند تمام مقادیری که در شبکه ارسال می شوند به ترتیب شبکه در میایند .
متد های HostToNetworkOrder اعداد صحیح چند بایتی ذخیره شده در سیستم میزبان را که به ترتیب بایت های آن بر اساس قوانین میزبان است به عددی تبدیل می کنند که ترتیب بایت های آن بر اساس شبکه است . متد NetworkToHostOrder بر عکس متد HostToNetworkOrder عمل می کند .

مثال :
با مثال زیر نشان می دهیم که چگونه می توانیم با استفاده از متد NetworkToHostOrder یک مقدار long را از ترتیب شبکه به ترتیب میزبان تبدیل کرد :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Socket0_2
{
class Program
{


static long networkByte;
static void Main(string[] args)
{


long hostByte;
hostByte = IPAddress.HostToNetworkOrder(networkByte);
Console.Write("Network byte order to host byte order of {0} is {1}", networkByte, hostByte);

Console.ReadKey();
}


}
}





پس از دو مثال از دو کاربرد اکنون کاربرد های دیگر را بررسی می کنیم .
اگر توجه کرده باشید ما در مثال اول از دستور Parse استفاده کردیم . این متد رشته ای را که حاوی ادرس IP با نشانه گذاری نقطه است (127.0.0.1) به نمونه ای از کلاس iPAddress تبدیل می کند


فیلد ها :
IPAddress.any
حاوی مقدار 0.0.0.0 است که واسطه مربوط به هر شبکه ای است
IPAddress.BroadCast
حاوی مقدار 255.255.255.255 که تمام میزبان های زیر شبکه را مشخص می کند
IPAddress.Loopback
حاوی مقدار 127.0.0.1 است که loopback مربوط به میزبان محلی است


لینک مثال ها :
112987

silsin
دوشنبه 27 آبان 1392, 20:55 عصر
کلاس IPHostEntry :
این کلاس توسط متد های کلاس Dns یعنی GetHostByName و GetHostByAddress و GetHostEntry برگردانده می شود. این کلاس حاوی اطلاعات DNS درباره میزبان است. مثل نام میزبان - ارایه ای از ادرس های ip و ارایه ای از Alias های میزبان
کلاس Dns :
حاوی تعدادی متد static برای بازیابی اطلاعاتی راجع به نام میزبان یا ادرس IP از DNS

مثال :
در این مثال می خواهیم نام ماشین را به دست بیاوریم


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Socket0_3
{
class Program
{
static void Main(string[] args)
{

IPHostEntry ips;
ips = Dns.GetHostEntry(IPAddress.Parse("127.0.0.1"));
Console.Write("PcName : " + ips.HostName);

Console.ReadKey();



}
}
}


پس از اجرای این مثال نام ماشینی که ip ان را وارد کرده بودیم برگردانده می شود و از انجایی که ما ادرس بازگشتی را انتخاب کرده بودیم نام سیستم خودمان را بر می گرداند .

معرفی متد :
در مثال بالا چند متد جدید را نمایش داده ایم :
خواص مربوط به IPHostEntry
AddressList
آرایه ای از نمونه های کلاس IPAddress
Aliases
ارایه ای از رشته ها که حاوی اسامی میزبان مستعار DNS است
HostName
رشته ای حاوی نام میزبان اصلی است

متد مربوط به dns :

Dns.GetHostEntry

نام میزبان یا ادرس ip را به نمونه ای از IPHostEntry تبدیل می کند که حاوی اطلاعات dns مربوط به میزبان است .

Dns.GetHostName()

رشته ای را بر می گرداند که حاوی نام میزبان کامپیوتر محلی است


GetHostByAddress
جستجو در نمونه IpAddress ورودی خود را معکوس کرده و یک نمونه از IPHostEntry را ارائه می کند که حاوی اطلاعات DNS مربوط به میزبان است
GetHostByName
جستجوی DNS را با پارامتر رشته ای نام میزبان انجام می دهد و یک نمونه از IPHostEntry را فراهم می کند که حاوی اطلاعات DNS مربوط به میزبان است

silsin
دوشنبه 27 آبان 1392, 23:22 عصر
مثال :
1 :
این برنامه نام میزبان را دریافت کرده و نام و ادرس ای پی میزبان محلی را ب همراه نام و ادرس های ای پی ورودی چاپ می کند .


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Socket0_4
{
class Program
{

static string host;
static void Main(string[] args)
{



String msg = "";
String msg2 = "";
String msg3 = "";

IPHostEntry hostInfo;
host = Console.ReadLine();
hostInfo = Dns.GetHostEntry(host);
msg = "\tHostName : " + hostInfo.HostName + "\r";
Console.WriteLine(msg);
Console.ReadKey();
msg2 = "\t IPAddress : " + msg2 + "\r";
foreach (IPAddress ipadder in hostInfo.AddressList)
{

msg2 += ipadder.ToString() + "";
}

Console.WriteLine(msg2);


msg3 = "\t Aliases : " + msg3 + "\r";
foreach (String Alias in hostInfo.Aliases)
{


msg3 += Alias + "";

}

Console.ReadKey();
Console.WriteLine(msg3);
Console.ReadKey();
}
}
}

silsin
جمعه 15 آذر 1392, 12:46 عصر
سوکت TCP :
وقتی دو فرایند از طریق TCP با یکدیگر ارتباط برقرار می کنند مثل این است که کانالی بین دو فرایند وجود دارد .
این ارتباط کانالی تا زمانی ادامه خواهد داشت که یکی از دو فرایند ان را ببندد .
وقتی یکی از فرایند ها میخواهد بایتی را ارسال کند این بایت ها بر روی کانال قرار می دهد .
در اینجا کانال به طور مستقیم به مقصد متصل بوده پس فرستنده نمی تواند ادرس مقصد را نیز همراه ان ارسال کند . علاوه بر این این کانال های ارتباطی , ارتباط قابل اطمینانی را برای صحت ارسال و دریافت اطاعات فراهم می کنند یعنی دقیقا همان دنباله از بایت هایی که ارسال شده توسط گیرنده دریافت می شود . به خاطر همین ویژگی است که Tcp را connection oriented می نامند .

محیط کاری .net دو کلاس مخصوص tcp را فراهم می کند . tcpClient و tcplistener اگر چه این دو کلاس سطح بالایی از امکانات کلاس socket را ارائه می دهند اما در ادامه خواهیم دید که موارد بسیاری نیز وجود دارند که عملیات پیشرفته فقط با استفاده از کلاس socket امکان پذیر خواهد بود.

سرویس گیرنده Tcp :
سرویس گیرنده Tcp مخابره را با سرویس دهنده ای که منتظر اتصال است اغاز می کند برای این کار سه مرحله تعریف شده است :
1- ایجاد نمونه ای از TcpClient
2 - ارسال با استفاده از سوکت استریم
3 - بستن اتصال


کلاس TcpClient :
این کلاس متد های ساده ای را برای اتصال سرویس گیرنده , ارسال و یا دریافت داده ها فراهم می کند . متد GetStream مربوط به این کلاس دستیابی به NetworkStream را امکان پذیر می سازد تا ارسال و دریافت داده ها را میسر سازد .


سازنده ها :

public TcpClient tcp;



tcp = new TcpClient("127.0.0.1", 2000);



در این نوع ادرس ها به صورت مستقیم وارد خواهند شد . توجه داشته باشید که مقدار اول HostName یا همان ادرس هاست و دومی پورتی که توسط tcpClient به ان متصل خواهد شد .



tcp = new TcpClient();


توجه داشته باشید که اگر سرویس دهنده مشخص نشود قبل از ارسال داده باید متد connect را فراخوانی کنید


tcp = new TcpClient();
tcp.Connect(IPAddress.Parse("127.0.0.1"), 2000);


توجه داشته باشید که علاوه بر ادرس دهی مستقیم می توانید از IpEndPoint نیز استفاده کنید :


public IPEndPoint EndPoint;




EndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000);
tcp = new TcpClient(EndPoint);




متد ها :

متد Close
این متد اتصال tcp را بسته و تمام منابع مربوط به tcpClient را ازاد می کند . توجه کنید زمانی که از NetworkStream استفاده میشود بهتر است Network Stream بسته شود تا به طور ضمنی سوکت نیز بسته شود .
بستن TcpClient منابع مربط به NetworkStream را ازاد نمی کند .


متد Connect
همانطور که گفته شد در صورتی که ادرس سرویس دهنده را مشخص نکنیم باید از این متد استفاده کنیم . این متد با استفاده از پارامتر های مقصدی که به آن ارسال می گردد به میزبان راه دور متصل میشود .

ادرس دهی به این متد نیز همانند قبل به وسیله
ادرس دهی مستقیم
به وسیله IpAddress
و یا به وسیله IpEndPoint می باشد


tcp.Connect(IPAddress.Parse("127.0.0.1"), 2000);



EndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000);
tcp.Connect(EndPoint);



tcp.Connect(IPAddress.Parse("127.0.0.1"), 2000);



متد GetStream
این متد نمونه از Network Stream را برای ارسال و دریافت داده ها ارسال می کند


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

سازنده :
Protected EndPoint
این سازنده توسط سازنده های کلاس مشتق فراخوانی می شود .

کلاس IpEndPoint
این کلاس نقطه انتهایی شبکه tcp/ip را به صورت یک ادرس ip و شماره پورت نمایش می دهد :

سازنده :

public IPEndPoint EndPoint;



EndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000);



EndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000);



EndPoint = new IPEndPoint(long Address , int port);




خواص :
IpAddress
یک نمونه از کلاس IpAddress که حاوی ادرس ip نقطه پایانی است

Port
یک مقدار صحیح که شماره پورت tcp یا udp نقطه پایانی را نشان می دهد . پورت باید در بازه MinPort و MaxPort باشد .

silsin
جمعه 15 آذر 1392, 19:56 عصر
سرويس دهنده Tcp :
بعد از بررسي موارد موجود در بخش TcpClient اکنون مي خواهيم بخش سرويس دهنده را مورد بررسي قرار دهيم .
روند کار در بخش سرويس دهنده Tcp به اين صورت است :
1 - نمونه اي از کلاس TcpLister با مشخص کردن پورت و ادرس محلي , و فراخواني متد Start() انجام مي شود . اين سوکت به اتصال هاي ورودي در پورت مشخص شده گوش مي دهد.
2 - به طور مکرر اعمال زير انجام مي شود :
فراخواني مکرر AcceptTcpClient براي دريافت اتصال سرويس گيرنده
مخابره با سرويس گيرنده با استفاده از متد هاي Read مربوط به networkStream
بستن اتصال و استريم سوکت با استفاده از متد Close

کلاس TcpListener :
اين کلاس به اتصال هاي درخواستي از سرويس گيرنده هاي شبکه گوش مي دهد .
سازنده اين کلاس :


listener = new TcpListener(IPAddress.Any, 8008);
listener = new TcpListener(8008);
listener = new TcpListener(ServerEndPoint);


اين کد سه شکل مقدار دهي اين کلاس را نشان مي دهد .


متد ها :


Start();


اين متد سوکت مورد نظر را تنظيم مي کند يعني مقدار اوليه مي دهد . و گوش دادن به درخواست هاي شبکه را اغاز مي کند .

Stop();


اين متد گوش دادن براي اتصال هاي درخواستي را متوقف مي کند و TcpListener را مي بندد .


Pending();

اگر در خوات اتصال معوقي وجود داشته باشد که بتواند پذيرفته شود مقدار true را بر مي گرداند.


AcceptSocket();

تقاضاي اتصال معوق را پذيرفته و سوکت را براي ارسال و دريافت داده ها بر مي گرداند .


AcceptTcpClient();

تقاضاي اتصال معوق را پذيرفته و يک TcpClient را براي ارسال و دريافت داده ها بر مي گرداند.

silsin
جمعه 15 آذر 1392, 20:09 عصر
بعد از این کار بیاید با یک مثال تست ارتباط بین دو کانال را انجام دهیم :

کد های سمت سرویس گیرنده :



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;


namespace TcpS
{
class Program
{

static String messageSend, MessageResived;
static TcpClient client;
static byte[] bytebuffer,byteReseved;
static NetworkStream netStream;
static void Main(string[] args)
{


//varibles




try
{
client = new TcpClient();
client.Connect(IPAddress.Parse("127.0.0.1"), 8008);
Console.WriteLine("Connected Succesfull...");
}
catch(Exception c)
{
Console.WriteLine(c.Message);

}

}
finally
{

netStream.Close();
client.Close();

}

Console.ReadLine();

}
}
}





کد های سمت سرویس دهنده :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Tcpc
{
class Program
{

static TcpListener listener;
static TcpClient SClient;
static NetworkStream Snetstream;
static byte[] MessageSend, MessageReseved;
static String MessageS, MessageR;
static void Main(string[] args)
{
try
{
listener = new TcpListener(IPAddress.Any, 8008);
listener.Start();
Console.WriteLine("Server Start ... ");
}
catch(Exception c)
{

Console.WriteLine(c.Message);


}

try
{
SClient = listener.AcceptTcpClient();
Snetstream = SClient.GetStream();
Console.WriteLine("Found Client");
}
catch
{



}




Console.ReadKey();
}
}
}









اجرا :


113566

fmehrvarzi
جمعه 15 آذر 1392, 22:27 عصر
آیا تو این نوع برنامه نویسی باید روی همه ی کامپیوتر ها دات نت فریمورک نصب باشه ؟
میشه توضیح بدید! خواهشاً

آبا میتونید دلایلی بیاورید که نشان دهد این نوع برنامه نویسی کجاها مورد استفاده و نیاز قرار میگیرد
ضرورت یادگیری ، کاربردها، اهمیت، ...
دوست دارم مطالب شما رو بخونم اما اول میخواهم در موردش بدونم

Saeed-CANcel
جمعه 15 آذر 1392, 22:36 عصر
من برنامه نویسی در محیط شبکه رو خیلی دوس دارم...ولی هیچی دربارش نمیدونم....
این تاپیک خیلی می تونه بهم کمک کنه... لطفا مراحل ساخت یه برنامه مثه چت رو هم بگین...ممنون!!!

silsin
شنبه 16 آذر 1392, 12:37 عصر
آیا تو این نوع برنامه نویسی باید روی همه ی کامپیوتر ها دات نت فریمورک نصب باشه ؟
میشه توضیح بدید! خواهشاً

آبا میتونید دلایلی بیاورید که نشان دهد این نوع برنامه نویسی کجاها مورد استفاده و نیاز قرار میگیرد
ضرورت یادگیری ، کاربردها، اهمیت، ...
دوست دارم مطالب شما رو بخونم اما اول میخواهم در موردش بدونم

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


- دلیل لازم نیست البته این بخشی که اینجا داره بررسی میشه مربوط به سوکت و برنامه نویسی Tcp/ip که خب این یک بخش از اونه
این یه تعریف خوبه :
به زبان ساده ، برنامه نویسی شبکه ، درباره حرکت فیزیکی بیتها از یک نقطه مانند A به نقطه B ، از طریق یک سیم و پاسخ دادن به داده هایی است که از نقطه A به نقطه B در طول شبکه حرکت کرده است.


در مورد کاربرد ها خب می تونم مثال بزنم .
مثلا انواع و اقسام نرم افزار های شبکه - مواردی بوده که خوده من از این روش برای برنامه نویسی بازی های تحت شبکه استفاده استفاده کردم و غیره ...

silsin
شنبه 16 آذر 1392, 19:59 عصر
پس از تست ارتباط اکنون بیاید پیغامی را از سرویس گیرنده به سرویس دهنده ارسال کنیم .

کدهای زیر را به کدهای بخش قبلی اضافه کنید :

کلاینت :

static byte[] bytebuffer ;





try
{
bytebuffer = ASCIIEncoding.ASCII.GetBytes("I'm Here !");
netStream.Write(bytebuffer, 0, bytebuffer.Length);
}
catch (Exception c)
{

Console.WriteLine(c.Message);

}


(*در مورد نام متغییر ها راستش همین الان نوشتمش دیگه حس نام گذاری دقیق نبود :D)
توضیح مختصر این بخش :
در اولین خط ما دو متغییر Byte برای ارسال پیغام ها تعریف کرده ایم چون ارسال های ما یعنی در کل ارسال ها باید بایت به بایت انجام شوند .

- در بلاک دوم ابتدا bytebuffer را مقدار دهی کرده و سپس به وسیله دستور write پیغام را به سمت سرور ارسال کردیم .


کد های بخش سرویس دهنده :
اکنون باید سرویس دهنده یا در کل طرف بعدی باید پیغام را دریافت کند .


byte[] MessageReseved = new byte[9066];



try
{

Snetstream.Read(MessageReseved, 0, MessageReseved.Length);
Console.WriteLine(ASCIIEncoding.ASCII.GetString(Me ssageReseved));
}
catch
{


}


- همانند قبل در اینجا نیز پیغام دریافت شده باید در یک متغییر بایتی قرار گیرد .
در بلاک بعدی ابتدا پیغام به وسیله متد read از طرف دیگر دریافت می شود و سپس با تبدیل به قالب متنی در خروجی چاپ خواهد شد
خروجی :

113638

silsin
شنبه 23 آذر 1392, 21:23 عصر
قرمز : مستقیما از منبع اصلی استفاده شده


سوکت های UDP :
UDP یک سرویس انتها به انتهای متفاوت از TCP را فراهم می کند ودر واقع این سرویس فقط دو کار را انجام می دهد
1 - لایه دیگری از ادرس دهی را به ای پی اضافه می کند
2 - خرابی که ممکن است در هنگام انتقال پیام رخ دهد را تشخیص داده و پیام های خراب را از بین می برد .
ویژگی ها :
به عنوان مثال سوکت های UDP لازم نیست قبل از به کارگیری متصل باشند. در حالی که Tcp با سیستم تلفنی مقایسه میشود UDP با سیستم پستی مقایسه می گردد . در سیستم پستی قبل از ارسال بسته یا نامه لازم نیست اتصالی برقرار باشد بلکه لازم است برای هر یک از آن ها آدرس مقصد مشخص باشد .به طور مشابه هر پیام ادرس خود را نیز حمل می کند . هنگام دریافت سوکت UDP همانند یک صندوق پستی که نامه ها یا بسته ها از مبدائ های مختلف در آن قرار می گیرد عمل می کند .

نکته :
با توجه به ویژگی ها نام برده شده چرا یک کاربرد به جای UDP از TCP استفاده می کند ؟
یک علت کارایی آن است . اگر کاربرد فقط داده های کمی را ارسال کند , مثلا یک پیام درخواست از سرویس گیرنده به سرویس دهنده و یک پیام پاسخ در طرف دیگر , برقراری اتصال TCP , تعداد پیام های مورد نیاز برای مخابره را دو برابر می کند . علت دیگر قابلیت انعطاف است . وقتی به غیر از سرویس استریم بایتی قابل اعتماد نیاز باشد UDP سربار اندکی را برای پیاده سازی در یک محیط نیاز دارد .

سرویس گیرنده UDP :
سرویس گیرنده UDP در سه مرحله عمل می کند :
1 - ساخت نمونه ای از UdpClient که آدرس محلی و پورت را تعیین می کند ( اختیاری)
2 - مخابره با ارسال و دریافت ارایه های بایتی با استفاده از متد های Send و Reseve در کلاس UdpClient
3 - در پایان سوکت را با استفاده از متد Close مربوط به UdpClientآزاد می کند .


در گزینه اول لغت اختیاری بودن اشاره شده به خاطر اینکه کلاس UdpClient لازم نیست ب استفاده از آدرس مقصد خاصی ساخته و یا متصل شود . این یکی از تفاوت های این دو سرویس است . در این سوکت نیازی نیست که قبل از مخابره اتصالی برقرار گردد و داده ها می توانند به مقصد های متفاوتی ارسال یا از آن ها دریافت شوند .

کلاس UdpClient :
این کلاس سرویس های شبکه بر اساس پروتکل UDP را در اختیار قرار می دهد .

سازنده ها :

UdpClient UdpA = new UdpClient();
UdpClient UdpC = new UdpClient(21);
UdpClient UdpD = new UdpClient("HostName", 2002);






IPEndPoint EndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),2002);
UdpClient UdpE = new UdpClient(EndPoint);


- اگر ادرس در سازنده مشخص نشود می توان این کار را یا در متد Connect و یا در متد Send انجام داد
- سازنده این کلاس می توانند مستقیما به پورت متصل شود
- در روش سوم مقدار دهی این کار به وسیله مقدار دهی نام هاست اتصال و شماره پورتی که در مقصد قرار دارد انجام می دهیم

- علاوه بر روش های قبل این کلاس می تواند به وسیله IPEndPoint نیز مقدار دهی شود .

متد ها :
Close - این متد اتصال UDP را می بندد
Connect :
این متد اختیاری مقصد پیش فرض را برای udpclient مشخص می کند .


UdpG.Connect(EndPoint);
UdpG.Connect(IPAddress.Parse("127.0.0.1"),2002);
UdpG.Connect("HostName",2002);



در بالا می توانید انواع روش های مقدار دهی به این متد را مشاهده کنید

متد Reseved

UdpG.Receive(ref EndPoint);



داده های ارسال شده توس یک میزبان را دور را به صورت ارایه بایتی بر می گرداند .

silsin
سه شنبه 26 آذر 1392, 21:23 عصر
مثال :


Byte[] BtR = Client.Receive(ref EndPoint);




مقدمه ای بر سوکت :
TcpLister , UdpClient , TcpClient برای پیاده سازی خود از کلاس Socket بهره می گیرند . کلاس Socket حاوی تمامی عملکرد های موجود در این کلاس و عملکرد های دیگر است . این کلاس می تواند WinSocket را پیاده سازی کند . در این بخش می خواهیم با بررسی دو سیستم سرویس دهنده و سرویس گیرنده استفاده از این کلاس را بررسی کنیم :
سرویس گیرنده TCP با کلاس Socket :

1- فراخوانی سازنده سوکت و مقدار دهی آن با نوع ادرس - نوع سوکت - و نوع پروتکل
2 - فراخوانی متد Connect کلاس سوکت . این متد یک پارامتر IPEndPoint را دریافت می کند که سرویس دهنده را مشخص می کند .
3 - ارسال و دریافت داده ها. با استفاده از متد های Send , Resevie کلاس Socket
4 - بستن سوکت با استفاده از Close کلاس Socket


شرح کلاس Socket :
این کلاس با توجه به API های WinSocket ساخته شده است . استفاده از کلاس Socket نیاز به مراحل زیر دارد :
1- ایجاد نمونه ای این کلاس
2 - اگر سوکت یک سرویس دهنده است نیاز است تا ابتدا Bind برای تعیین نقطه پایانی (EndPoint)
اگر سوکت یک سرویس گیرنده است نیاز است تا به وسیله Connect به آن متصل شوید .
3 - اگر سوکت یک سرویس دهنده Listen را فراخوانی کنید تا اتصال درخواستی (ورودی) را بازیابی کنید .

4 - با استفاده از متد های Send و Receive داده ها را روی Tcp ارسال کنید .
5 - فراخوانی Shutdown برای غیر فعال کردن سوکت
6 - فراخوانی Close برای بستن سوکت

سازنده :

Public Socket

مثال :

Socket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


پارامتر ها را در ادامه بررسی می کنیم .

متد ها :
public void Bind

IPEndPoint ServerEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
ServerSocket.Bind(ServerEndPoint);

نقطه پایانی محلی را به Socketمقید می کند .

Public void Close
اتصال سوکت را می بندد.

Public void Connect


IPEndPoint ClientEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);

try
{

ClientSocket.Connect(ClientEndPoint);
Console.WriteLine("Succefull Connected To Server " + " Server Address : " + ClientEndPoint.Address);


}
catch(SocketException Se)
{



Console.WriteLine("Error Message : " + Se.Message + " Error Code : " + Se.ErrorCode);



}

اتصالی را به سرویس دهنده راه دور برقرار می کند
پارامتر مققدار : EndPoint

silsin
جمعه 29 آذر 1392, 16:38 عصر
Public Void Listen
وضعیت سوکت را برای مدیریت درخواست های اتصال تغییر می دهد تا توسط برنامه پذیرفته شود . مقدار داخلی یک مقدار عددی بوده و نشان دهنده حداکثر تعداد در خواست های اتصال است

ServerSocket.Listen(5);


متد Send
این متد داده های بایتی را به سمت سوکت مقصد ارسال می کند
مقدار دهی این متد :

ClientSocket.Send(Send);
ClientSocket.Send(Send, SocketFlags.None);
ClientSocket.Send(Send, Send.Length, SocketFlags.None);
ClientSocket.Send(Send, 0, Send.Length, SocketFlags.None);



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

توجه داشته باشید که به جز مقدار داده بایتی ارسالی تمامی مقادیر دیگر اختیاری می باشند



متد Recevie
وظیفه این متد مشخص کردن داده ای است که از سوکت گرفته شده و وارد بافر بایتی می شود
مقدار دهی این متد :

ClientSocket.Receive(Reseved);
ClientSocket.Receive(Reseved, SocketFlags.None);
ClientSocket.Receive(Reseved, Reseved.Length, SocketFlags.None);
ClientSocket.Receive(Reseved, 0, Reseved.Length, SocketFlags.None);


به این نکته توجه داشته باشید که اینبار در حالت برگشت بایت های دریافت شده از سوکت در مقدار بافر Reseved که در مثال بالا نمایش داده ایم ذخیره میشوند.

* تمامی مقادیر به جز مقدار دریافتی اول اختیاری می باشند


متد ShutDown :
وظیفه این متد این است که ارسال و دریافت را در سوکت غیر فعال کند

مقدار دهی این متد :

ClientSocket.Shutdown(SocketShutdown.Both);
ClientSocket.Shutdown(SocketShutdown.Receive);
ClientSocket.Shutdown(SocketShutdown.Send);


همانطور که مشاهده می شود این متد مقداری را به عنوان ورودی گرفته که تعیین کننده این است که چه کاری باید غیر فعال شود
به ترتیب :
دریافت و ارسال
دریافت
ارسال


اولین مثال از بخش سوکت :

silsin
جمعه 29 آذر 1392, 17:06 عصر
مثال :
در این برنامه سرور و کلاینت با ارسال پیغام به یکدیگر ارتباط را نمایش خواهند داد
کد های بخش کلاینت :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SockettClient
{
class Program
{
static byte[] Send;


static void Main(string[] args)
{


Socket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ClientEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);

try
{

ClientSocket.Connect(ClientEndPoint);
Console.WriteLine("Succefull Connected To Server " + " Server Address : " + ClientEndPoint.Address);


}
catch(SocketException Se)
{



Console.WriteLine("Error Message : " + Se.Message + " Error Code : " + Se.ErrorCode);



}
byte[] Resevd = new byte[9065];
if (ClientSocket.Connected)
{

try
{

ClientSocket.Receive(Resevd);
Console.WriteLine("ServerMessage : " + ASCIIEncoding.ASCII.GetString(Resevd));



}
catch (SocketException Se)
{



Console.WriteLine("Error Message : " + Se.Message + " Error Code : " + Se.ErrorCode);



}








try
{

Send = ASCIIEncoding.ASCII.GetBytes("How Are You ?!");
ClientSocket.Send(Send, 0, Send.Length, SocketFlags.None);


}
catch (SocketException Se)
{



Console.WriteLine("Error Message : " + Se.Message + " Error Code : " + Se.ErrorCode);



}




}
else
{


Console.WriteLine("Server Not Found . ... . .");

}









Console.ReadKey();



}
}
}




کد های بخش سرور :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SocketServer
{
class Program
{



static void Main(string[] args)
{

byte[] Send = new byte[9065];
byte[] Reseved = new byte[9065];
Socket ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ServerEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
ServerSocket.Bind(ServerEndPoint);
ServerSocket.Listen(5);
Console.Write("Wainting For Client ..." );



Socket ClientSocket = ServerSocket.Accept();





try
{

Send = ASCIIEncoding.ASCII.GetBytes("Hi I Am Server !!");

ClientSocket.Send(Send, 0, Send.Length, SocketFlags.None);
Console.WriteLine("Welcom Message Was Send!");


}
catch (SocketException Se)
{

Console.WriteLine(" Error : " + Se.Message + " Error Code : " + Se.ErrorCode);



}



try
{


ClientSocket.Receive(Reseved, 0, Reseved.Length, SocketFlags.None);


Console.WriteLine(ASCIIEncoding.ASCII.GetString(Re seved, 0, Reseved.Length));

}
catch (SocketException Se)
{

Console.WriteLine(" Error : " + Se.Message + " Error Code : " + Se.ErrorCode);



}




Console.ReadKey();
}
}
}



خروجی :

114189


نکات مثال :





catch(SocketException Se)
{



Console.WriteLine("Error Message : " + Se.Message + " Error Code : " + Se.ErrorCode);



}


خوشبختانه سوکت به ما خروجی استثنائ نیز تحویل می دهد یعنی در صورت استفاده از آن مثلا در ساختار try می توانیم مشاهده کنیم که با بروز خطا پیغام مناسب آن نیز نمایش داده می شود

if (ClientSocket.Connected)

این متد bool نشان دهنده ان است که ایا سوکت حاظر به سوکت راه دوری اتصال پیدا کرده است یا خیر



Socket ClientSocket = ServerSocket.Accept();

در این خط نمونه ای از سوکت سرویس گیرنده برای اتصال جدید tcp ایجاد میشود . وقتی سرویس دهنده اماده اداره کردن سرویس گیرنده است متد Accept را فراخوانی می کند این متد مسدود میشود تا یک اتصال ورودی به پورت سوکت سرویس دهنده برسد . سپس متد Accept نمونه ای از سوکت را بر می گرداند که قبلا به سوکت راه دور متصل شده و اماده خواندن و نوشتن است

silsin
جمعه 29 آذر 1392, 22:32 عصر
مفاهیم پیشرفته در سوکت
قسمت اول :بررسی مدل های مختلف برنامه نویسی سوکت

مقدمه :
تا اینجای کار با مفاهیم - تکنیک ها و مثال های متعددی از کارایی سوکت و برنامه نویسی تحت سوکت رابررسی کرده ایم اما اکنون مسئله مهم تری را مورد بررسی قرار خواهیم داد .
سازکار روش فعلی به این صورت عمل می کند که زمانی که در خواست ها ارسال و یا دریافت می شوند متد هایی که بررسی کرده بودیم مسدود شده تا اتصالی برقرار شود اگر برنامه های قبلی را تحت فرم به اجرا در بیاوریم این مسئله بیشتر نمایان می شود. در هنگام اتصال سرور تا زمانی که کلاینت راه اندازی نشود برنامه سرور در حالت تمام متوقف خواهد بود و یا هنگام ارسال پیغام از یک طرف تا زمانی که طرف دوم پیغام را دریافت نکند سمت فرستنده به طول کامل مسدود خواهد بود .
اما اگر در همین حالت برنامه که منتظر کامل شدن فراخوانی متد است کار دیگری برای انجام دادن داشته باشد چه باید بکند ؟ ممکن است این برنامه وقت کافی را برای انتظار تا کامل شدن فراخوانی متد مسدود شده نداشته باشد . یا مثلا اگر داده به مقصد نرسد و به طور طبیعی متد مسدود شده نیز فراخوانی نخواهد شد و برنامه ارسال کننده متوقف می شود. تمامی این مشکلات بر اثر مفهمومی به نام سنکرون اتفاق می افتد
همین انتظار برای فراخوانی در حقیقت مفهموم این کلمه را می رساند و ضد ان با نام اسنکرون شناخته میشود .
در روش هایی که در بخش های اینده خواهید اموخت می توانید این روند را کنترل کنید و برنامه های سنکرون را به اسنکرون تبدیل کنید .

1- I/o بدون وقفه :
برای این بخش سه راهکار وجود دارد
1- بررسی وضعیت I/O
2 - فراخوانی مسدود کننده با مهلت زمانی
3 - سوکت بدون انسداد


بررسی وضعیت I/O
یکی از روش های اجتناب از مسدود شدن عدم اجرای فراخوانی است که منجر به مسدودی میشود. در اینجا برای فراخوانی I/O که می تواند مسدود شوند قبلا وضعیت آن را بررسی کرده تا مشخص کنیم ایا این عمل مسدود خواهد شد یا خیر !
اگر این بررسی نشان می دهد که فراخوانی مسدود نخواهد شد می توان ان را انجام داد و مسلما انتظار هم خواهیم داشت که عمل فورا کامل شود . اما در صورتی که این بررسی نشان دهد که فراخوانی مسدود می شود می توان پردازش های دیگری را انجام داد و بعدا دوباره وضعیت I/O را بررسی کرد .

هنگام خواندن داده ها در TcpClient این کار با بررسی خاصیت DataAvailable مربوط به NetworkStream وابسته به ان انجام می شود که دو مقدار صحیح و یا غلط را بر می گرداند.


IPEndPoint Endp = new IPEndPoint(IPAddress.Any, 9050);
TcpClient Client = new TcpClient();

Client.Connect(Endp);

NetworkStream Ns = Client.GetStream();

if (Ns.DataAvailable)
{

//do Read

}
else
{


//No data Availabe, Do other processing

}




برای بررسی Tcplistener کافی است قبل از فراخوانی AcceptTcpClient یا AcceptSocket متد Pending فراخوانی شود تا مشخص گردد که ایا اتصال معوق هستند یا خیر
اگر پاسخ بله بود مقدار true در غیر اینصورت false را بر می گرداند .

IPEndPoint Endp = new IPEndPoint(IPAddress.Any, 9050);

TcpListener TServer = new TcpListener(Endp);
TServer.Start();


if (TServer.Pending())
{

TcpClient client = TServer.AcceptTcpClient();


}
else
{


//No Connections Pending at this time

}




در مورد کلاس Socket برای بررسی وضعیت I/O می توان از خاصیت Available استفاده کرد که این خاصیت همیشه حاوی تعداد بایت هایی است که از شبکه در یافت شده ولی هنوز خوانده نشده . پس اگر Available بزرگتر از 0 باشد عمل خواندن مسدود نخواهد شد


IPEndPoint Endp = new IPEndPoint(IPAddress.Any, 9050);
Socket Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket.Connect(Endp);

if (Socket.Available > 0)
{

// We Have Data To Read


}
else
{

//No Data Available to Read at this time


}


متد Poll کلاس سوکت نیز امکان بررسی وضعیت I/O را فراهم می کند که در ادامه ان را بررسی خواهیم کرد .

silsin
یک شنبه 01 دی 1392, 21:13 عصر
فراخوانی مسدود کننده با مهلت زمانی
در بخش قبل با مطرح کردن چند نمونه کد و مثال چگونگی بررسی I/O را قبل از انجام عمل I/O مطرح کردیم اما گاهی ممکن است لازم باشد بدانیم که بعضی از رویدادهای I/O در مدت زمان خاصی رخ نمی دهد . این مسئله برای این به کار می رود تا ما بتوانیم اگر داده گرام قبل از انقضای تایمر دریافت شود متد مربوط را از حالت انسداد خارج کرده تاسرویس گیرنده بتواند داده گرام مفقود را اداره کرده و منطقا از حالت مسدودی بیرون بیاید .
به وسیله امکاناتی که کلاس سوکت در اینجا در اختیار ما قرار می دهد می توان تعیین کرد که حداکثر زمان مسدود شدن روی ارسال و دریافت داده ها را تعیین کرد . این کار با خواص SocketOption.SendTimeOut و SocketOption.ReceiveTimeOut انجام می شود .

ClientSocket.SetSocketOption(SocketOptionLevel.Soc ket, SocketOptionName.SendTimeout, 3000);


در صورتی که از کلاس TcpClient استفاده کنیم این کار به این صورت انجام می شود :
Tc.ReceiveTimeout = 500;

نکته :
هر دو مورد اگر قبل از خاتمه فراخوانی متد زمانی مشخص شده به اتمام برسد استثنائ 10060 به معنای پایان اتصال را ارائه خواهند داد .


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

مثال :


while (ClientSocket.Poll(10000, SelectMode.SelectWrite))
{



try
{

string Input = textBox1.Text;
bytebuffer = ASCIIEncoding.ASCII.GetBytes(Input);

ClientSocket.Send(bytebuffer, 0, bytebuffer.Length, SocketFlags.None);
}
catch (SocketException se)
{

MessageBox.Show(se.Message);


}


}





این متد دو گزینه را دریافت می کند . یک مقدار صحیح که بر حست میکروثانیه که مدت انتظار برای دریافت پاسخ را مشخص می کند و mode که مشخص کننده ان است که منتظر چه عملیاتی هستیم.
- زمان انتظار می تواند منفی نیز باشد که در ان صورت یک زمان نامتناهی را نشان دهد
- زمان انتظار میتواند صفر باشد که در ان صورت این متد برای بررسی پیشاپیش مورد استفاده قرار می گیرد
SelectMode شامل سه گزینه است :
SelectWrite
SelectRead
SelectError
اگر عملیات سوکت برابر با هرکدام باشد مقدار True و در غیر اینصورت مقدار False را بر میگرداند .

به طور کلی استفاده از این روش بسیار ناکارامد است . زیرا برای بررسی وضعیت ورودی ها و خروجی ها این متد به صورت مکرر فراخوانی میشود. این عمل را گاهی busy waiting نیز می نامند زیرا دائما وضعیت را بررسی می کند . البته را ه های اجتناب از این امر نیز وجود دارد که در ادامه آن ها را بررسی می کنیم .