PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : برنامه نويسي شبكه در #c



Borna66
05-01-2012, 12:01 AM
با توجه به مطالبی که در بخش Socket Programming - Overview از وبلاگ آمده است، اکنون شما می توانید برنامه نویسی سوکت را در C# آغاز کنید. از مزایای برنامه نویسی در محیط Visual Studio استفاده از محیط کاری .NET می باشد که کتابخانه قدرتمندی از API را برای برنامه نویسی فراهم می کند. از بین کتابخانه هایی که در .NET ارائه شده است، فضاهای نام System.Net و System.Net.Sockets برای برنامه نویسی سوکت بکار می روند. در کلیه مراحل آموزش و برنامه ها، از APIهایی که در این فضاهای نام موجود هستند استفاده خواهیم کرد. به عنوان اولین برنامه سوکت نشان خواهیم داد که چگونه برنامه های کاربردی C# میزبان های شبکه (Host) را پیدا می کنند. و در ادامه سرویس دهنده و سرویس گیرنده های TCP و UDP را به صورت مجزا آموزش می دهیم. سرانجام، کلاس Socket را بررسی می کنیم که پیاده سازی خاصی از تمام کلاس های سوکت سطح بالای .NET است.
روند آموزش هر مبحث به این روش است که در ابتدا کلاس های (Class) جدیدی که در هر برنامه استفاده شده است را به همراه توابع مورد نیاز آن توضیح داده و در ادامه کد اصلی برنامه ها را به صورت خط به خط مورد تجزیه و تحلیل قرار می دهیم.
توجه: از آنجا که تشریح هر مبحث قدری طولانی می شد، مباحث و برنامه های مربوط به هر بخش را تحت عنوان یک موضوع مجزا در قسمت موضوعات وبلاگ دسته بندی کرده ام.
توجه: تمامی برنامه ها در محیط Microsoft Visual Studio 2008 برنامه نویسی شده است.

Borna66
05-01-2012, 12:02 AM
پیدا کردن یک میزبان در شبکه
در برنامه ای که در این قسمت تشریح می کنیم، نشان می دهیم که چطور می توان یک میزبان (Host) را در شبکه هدف قرار داد و به اطلاعات DNSی آن میزبان دسترسی داشت.



Download Project Source Code – 40.1 KB (http://www.njavan.com/forum/redirector.php?url=http%3A%2F%2Fpnrblog.persiangig .com%2Fdocument%2FSocketProInCSharp%2FIPAddres%2A% 2A%2Aample.rar)

(http://www.njavan.com/forum/redirector.php?url=http%3A%2F%2Fpnrblog.persiangig .com%2Fdocument%2FSocketProInCSharp%2FIPAddres%2A% 2A%2Aample.rar)


http://pnrblog.persiangig.com/image/SocketProInCSharp_Images/SocketProInCSharp_Image001.bmp




تشریح فضاهای نام و کلاس های مورد نیاز


در این برنامه از فضای نام System.Net برای استفاده از کلاس های Dns, IPHostEntry, IPAddress و فضای نام System.Net.Sockets برای مدیریت کردن استثناء هایی که ممکن است در خلال برنامه رخ دهد استفاده خواهیم کرد.


توسط متد GetHostName() از کلاس Dns می توان به نام کامپیوتر محلی و یا همان Local Host دسترسی داشت. توسط متد GetHostEntry(…) از کلاس Dns می توان به اطلاعات DNSی مربوط به یک میزبان (Host) مشخص دسترسی داشت. این متد یک پارامتر دریافت می کند که پارامتر آن می تواند یا آدرس IP میزبان و یا نام میزبان مورد نظر باشد. به عنوان مثال پارامتر می تواند به فرم های 192.168.0.1 و یا comp10 و یا www.microsoft.com باشد. و اما خروجی این متد از نوع کلاس IPHostEntry بوده و توسط objectی از این کلاس می توانیم اطلاعات DNSی دریافت شده میزبان مورد نظر را در خروجی چاپ کنیم.


همانطور که گفته شد اطلاعات خروجی متد GetHostEntry(…) در قالب کلاس IPHostEntry می باشد. از این پس می توانیم توسط سه خصوصیت HostName, AddressList و Aliases از کلاس IPHostEntry کلیه اطلاعات DNSی میزبان مورد نظر را مشاهده کنیم. توسط خصوصیت HostName از کلاس IPHostEntry می توان به نامی که برای میزبان در DNS ثبت شده است دسترسی داشت. توسط خصوصیت AddressList از کلاس IPHostEntry که خروجی آن آرایه ای از نوع کلاس IPAddress می باشد، می توان به IPهایی که در DNS برای میزبان ثبت شده است دسترسی داشت و توسط خصوصیت Aliases از کلاس IPHostEntry که خروجی آن یک آرایه رشته ای است، می توان به نام های مستعاری که در DNS برای میزبان مورد نظر ثبت شده است، دسترسی داشت.
و اما کلاس IPAddress، این کلاس برای کار بر روی آدرس های IP متدهایی در اختیار برنامه نویس قرار می دهد که کار کردن با آدرس های IP را راحت می کند. به عنوان مثال توسط متد Parse(…) از این کلاس می توان یک آدرس IP که به صورت رشته می باشد را به یک آدرس IP 32 بیتی مورد استفاده در ساختار شبکه ها تبدیل کرد.


تشریح کدهای برنامه



در این برنامه یک روال به نام PrintHostInfo وجود دارد که توسط آن کلیه اطلاعات DNSی میزبانی که نام آن را در txtURL نوشته ایم بدست آورده و در txtMessage چاپ می کنیم. پس در ابتدا بهتر است کد های این روال را توضیح دهیم.

کد:



1 public void PrintHostInfo(String host) 2 { 3 try 4 { 5 IPHostEntry hostInfo; 6 // Attempt to resolve DNS for given host or address 7 hostInfo = Dns.GetHostEntry(host); 8 // Display the primary host name 9 txtMessage.Text += "\r\nCanonical Name: " 10 + hostInfo.HostName + "\r\n"; 11 // Display list of IP addresses for this host 12 txtMessage.Text += "IP Addresses:\r\n"; 13 foreach (IPAddress ipaddr in hostInfo.AddressList) 14 { 15 txtMessage.Text += ipaddr.ToString() + "\r\n"; 16 } 17 // Display list of alias names for this host 18 txtMessage.Text += "Aliases:\r\n"; 19 foreach (String alias in hostInfo.Aliases) 20 { 21 txtMessage.Text += alias + "\r\n"; 22 } 23 } 24 catch (Exception) 25 { 26 MessageBox.Show("Unable to resolve host: " + host); 27 } 28 } // end method PrintHostInfo










در خط شماره 5 یک object به نام hostInfo از نوع کلاس IPHostEntry تعریف می کنیم تا از این object برای قرار دادن اطلاعات DNSی میزبان مورد نظر استفاده کنیم. در خط شماره 7 توسط متد GetHostEntry(host) از کلاس Dns کلیه اطلاعات DNSی میزبانی که نام آن را توسط پارامتر host به این روال ارسال کرده ایم بدست آورده و در متغیر hostInfo قرار می دهیم. خط شماره 9 و 10 نام میزبان مورد نظر را به همراه یک پیغام دیگر ترکیب کرده و در txtMessage قرار می دهد. توجه کنید که این نام همان نامی است که به عنوان Computer Name در کامپیوتر تنظیم می کنید. خطوط 13 الی 16 کلیه IPهایی که برای این میزبان در DNS ثبت شده است را در txtMessage قرار می دهد. دستور hostInfo.AddressList یک آرایه ای را مشخص می کند که شامل کلیه IPهایی است که در DNS برای میزبان ثبت شده است. و دستور خط 13 می گوید برای هر IPای که در AddressList است کد داخل حلقه foreach اجرا شود. خطوط 19 الی 22 همانند قسمت قبل کلیه نام های مستعاری که برای میزبان در DNS ثبت شده است را در txtMessage قرار می دهد.


اگر در هنگام وارد کردن نام میزبان در txtURL یک نام نامعتبر وارد کنید برنامه در هنگام اجرای کد در خط 7 با یک استثناء مواجه می شود. برای مدیریت این خطا ها در برنامه، کدها را در بلوک try, catch قرار می دهیم.




کدهایی که در رویداد Load مربوط به فرم برنامه قرار دارد به شرح زیر می باشد:





کد:

1 // Get and print local host info 2 try 3 { 4 txtMessage.Text = "*** LOCAL HOST ***" + "\r\n"; 5 String localHostName = Dns.GetHostName(); 6 txtMessage.Text += "Host Name: " + localHostName; 7 PrintHostInfo(localHostName); 8 } 9 catch (Exception) 10 { 11 MessageBox.Show("Unable to resolve local host.\n\r"); 12 }




در خط شماره 5 توسط متد GetHostName() از کلاس Dns نام کامپیوتر محلی و یا همان Local Host از سیستم دریافت شده و در متغیر رشته ای LocalHostName قرار می گیرد. در واقع این دستور نام همان کامپیوتری که برنامه در آن اجرا می شود را به دست می آورد. در خط شماره 7 و توسط کدPrintHostInfo(localHostName); نام کامپیوتر محلی به روال PrintHostInfo() ارسال می گردد تا اطلاعات کامپیوتر محلی در txtMessage قرار گیرد. (همانطور که در شکل فوق مشاهده می شود). همانطور که مشاهده می کنید باز هم کدها در بلاک try, catch نوشته شده اند. چون ممکن است هنگام اجرای متد PrintHostInfo() در تحلیل میزبان با خطا مواجه شویم.



کدهایی که در رویداد Click مربوط به دکمه Resolve قرار دارد به شرح زیر می باشد:


کد:


1 // Get and print remote host info 2 txtMessage.Clear(); 3 txtMessage.Text = "*** REMOTE HOST ***"; 4 PrintHostInfo(txtURL.Text);


در خط شماره 4 روال PrintHostInfo() فراخوانی می شود و مقداری که کاربر در txtURL وارد کرده است به عنوان پارامتر به این روال ارسال می گردد. حال روال PrintHostInfo() میزبان مورد نظر را در شبکه جستجو کرده و اطلاعات DNSی آن میزبان را در txtMessage قرار می دهد.