دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

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

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
نمایش نتایج: از شماره 1 تا 3 , از مجموع 3

موضوع: برنامه نويسي شبكه در #c

  1. #1
    یار همراه
    رشته تحصیلی
    مهندسی کامپیوتر - نرم افزار
    نوشته ها
    2,968
    ارسال تشکر
    5,023
    دریافت تشکر: 4,729
    قدرت امتیاز دهی
    3407
    Array
    Bad Sector's: جدید102

    Arrow برنامه نويسي شبكه در #c

    با توجه به مطالبی که در بخش 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 برنامه نویسی شده است.
    برای داشتن چیزی که تا به حال نداشته اید
    باید کسی باشید که تا به حال نبوده اید

  2. کاربرانی که از پست مفید Bad Sector سپاس کرده اند.


  3. #2
    یار همراه
    رشته تحصیلی
    مهندسی کامپیوتر - نرم افزار
    نوشته ها
    2,968
    ارسال تشکر
    5,023
    دریافت تشکر: 4,729
    قدرت امتیاز دهی
    3407
    Array
    Bad Sector's: جدید102

    پیش فرض پیدا کردن یک میزبان در شبکه

    در برنامه ای که در این قسمت تشریح می کنیم، نشان می دهیم که چطور می توان یک میزبان (Host) را در شبکه هدف قرار داد و به اطلاعات DNSی آن میزبان دسترسی داشت.




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


    در این برنامه از فضای نام 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 قرار می دهد.
    ویرایش توسط Bad Sector : 6th February 2011 در ساعت 02:58 AM
    برای داشتن چیزی که تا به حال نداشته اید
    باید کسی باشید که تا به حال نبوده اید

  4. کاربرانی که از پست مفید Bad Sector سپاس کرده اند.


  5. #3
    یار همراه
    رشته تحصیلی
    مهندسی کامپیوتر - نرم افزار
    نوشته ها
    2,968
    ارسال تشکر
    5,023
    دریافت تشکر: 4,729
    قدرت امتیاز دهی
    3407
    Array
    Bad Sector's: جدید102

    پیش فرض برنامه Server و Client با پروتكل TCP

    در این قسمت از آموزش برنامه نویسی شبکه در C# یک برنامه Client و یک برنامه Server تحت Consol خواهیم نوشت که این دوبرنامه برای برقراری ارتباط با هم از پروتکل TCP استفاده می کنند. در واقع این دو برنامه از طریق یک سوکت TCP با هم ارتباط برقرار خواهند کرد و برنامه Client یک رشته متنی Hello Server! را به Server ارسال کرده و Server بعد از دریافت این رشته، دوباره همین رشته را به Client برمی گرداند.

    توجه: برای اجرای برنامه ابتدا برنامه Server و سپس برنامه Client را اجرا کنید.




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


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


    محیط کاری .NET دو کلاس مخصوص TCP فراهم می کند که عبارت اند از TcpClient و TcpListener. نمونه ای و یا objectی از هر یک از این کلاس ها، یک طرف اتصال TCP را مشخص می کند. در اتصال TCP سمت مقابل (برنامه ای بر روی کامپیوتر مقابل) توسط یک آدرس IP و یک شماره پورت مشخص می شود. برقراری ارتباط به این صورت است که TCP سرویس گیرنده یک تقاضای اتصال به TCP سرویس دهنده ارسال می کند و در این سمت objectی از کلاس TcpListener به تقاضا های اتصال TCP گوش فرا می دهد و با ورود اولین درخواست، یک سوکت TCP بین خودش و سرویس گیرنده ایجاد می کند.


    تشریح برنامه سرویس گیرنده (TCPEchoClient)


    در برنامه سرویس گیرنده از فضای نام System.IO برای IOExceptionها و از فضای نام System.Net.Sockets برای استفاده از دو کلاس TCPClient و NetworkStream و همچنین مدیریت استثنا های SocketException استفاده شده است.


    توسط objectی از کلاس TCPClient می توان یک سوکت در سمت Client برای برقراری ارتباط با Server ایجاد کرد. در هنگام ساختن objectی از این کلاس می توان نام Server و شماره پورتی که سرور مشغول گوش دادن به آن است را مشخص کرد. کلاس بعدی کلاس NetworkStream می باشد که توسط objectی از این کلاس و همچنین توسط متد GetStream() از کلاس TCPClient می توان به کانال ارتباطی که بعد از برقرای اتصال بین سرویس گیرنده و سرویس دهنده برقرار می شود دسترسی داشت. از این پس می توان با استفاده از متد های Write(…) و Read(..) مربوط به کلاس NetworkStream اطلاعات را در کانال نوشت و یا از آن خواند. اطلاعاتی که قرار است در کانال به منظور ارسال به سمت مقابل قرار گیرد باید به صورت یک آرایه بایتی باشد.


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


    همانطور که گفته شد این برنامه یک برنامه Consol Application می باشد و در ذیل کدهای تابع Main() برنامه آورده شده است که به تشریح این کدها خواهیم پرداخت.

    کد:
                1  static void   Main(string[]   args)
       2  {            
       3      TcpClient client = null;
       4      NetworkStream netStream = null;
       5      try
       6      {
       7         // create socket that is connected   to server on specified port
       8         client = new TcpClient("127.0.0.1",   8000);                
       9         netStream = client.GetStream();
       10        byte[] byteBuffer = Encoding.ASCII.GetBytes("Hello   Server!");
       11        //   send the encoded string to the server
       12        netStream.Write(byteBuffer,   0, byteBuffer.Length);
       13        Console.WriteLine(byteBuffer.Length   + " bytes sent to server.");
       14        int   totalBytesRcvd = 0; // total bytes received so far
       15        int byteRcvd = 0;       // bytes   received in last read
       16        //   receive the same string back from the server
       17        while   (totalBytesRcvd < byteBuffer.Length)
       18        {      
       19           if   ((byteRcvd = netStream.Read(byteBuffer,totalBytesRcvd,
       20                             byteBuffer.Length -   totalBytesRcvd))== 0)
       21           {
       22              Console.WriteLine("Connection closed.");
       23              break;
       24           } // end if
       25           totalBytesRcvd   += byteRcvd;
       26        } // end while
       27        Console.WriteLine(byteBuffer.Length   + 
       28                "   bytes received from server >>> " +
       29        Encoding.ASCII.GetString(byteBuffer,0,byteBuffer.Length));
       30     } //   end try
       31     catch   (Exception err)
       32     {
       33        Console.WriteLine(err.ToString());
       34     } //   end catch
       35     finally
       36     {
       37        netStream.Close();
       38        client.Close();
       39        Console.ReadKey();
       40     } //   end finally
       41 } // end method main

    در خط شماره 3 یک شی به نام client از کلاس TcpClient می سازیم که از این شی برای برقراری ارتباط با سروری که شماره IP و شماره پورت آن را می دانیم استفاده می کنیم. همانطور که گفتیم، وقتی که دو کامپیوتر از طریق TCP با هم اتباط برقرار می کنند، بین آنها یک کانال ارتباطی برقرار می شود که این کانال تا زمانی که یکی از دو کامپیوتر ارتباط را قطع نکرده باشند برقرار است. در خط شماره 4 یک شی به نام netStream از کلاس NetworkStream ساخته می شود تا بعد از برقراری اتصال با سرور بتوانیم توسط این شی از کانال ارتباطی استفاده کنیم.


    در خط شماره 8 شی client را توسط سازنده کلاس TcpClient که دو پارامتر دریافت می کند مقدار دهی می کنیم. پارامتر اول سازنده، نام کامپیوتر مقصد (Server) و پارامتر دوم، شماره پورت در کامپیوتر مقصد است که برنامه Server در حال گوش دادن به آن پورت می باشد. در واقع با این دستور یک سوکت بین Client و Server ساخته می شود. در خط شماره 9 توسط متد GetStream() شی client همان کانال ارتباطی که از آن صحبت کردیم را در دست گرفته و به شی netStream اختصاص می دهیم. حال می توان توسط متد های Write(…) و Read(…) شی netStream در این کانال اطلاعات را بنویسیم و یا از آن بخوانیم. برای ارسال اطلاعات در NetworkStream باید اطلاعات در قالب یک آرایه ای از نوع byte باشد، به همین منظور در خط شماره 10 یک آرایه از نوع byte تعریف کرده و توسط دستور Encoding.ASCII.GetBytes("Hello Server!") رشته Hello Server! را به صورت آرایه ای از بایت ها تبدیل می کنیم.


    در خط شماره 12 توسط متد Write(…) شی netStream اطلاعات را در کانال می نویسیم و در سمت مقابل برنامه Server می تواند توسط متد Read(…) اطلاعات را دریافت کند. پارامتر اول دستور Write(…) آرایه بایتی را مشخص می کند که قرار است اطلاعات آن ارسال شود، پارامتر دوم تعیین می کند که از کدام محل از آرایه شروع به ارسال اطلاعات کند، و پارامتر سوم تعیین کننده مقدار اطلاعاتی است که باید ارسال شود.


    همانطور که گفتیم برنامه Server متن ارسالی توسط Client را دریافت کرده و همان متن را دوباره به سمت Client ارسال می کند. در این برنامه برای دریافت متن ارسالی از سمت Server، در خطوط شماره 17 الی 26 از یک حلقه while استفاده می کنیم. زمانی که Server فرایند ارسال خود را به پایان رساند، مقدار بازگشتی از متد Read(…) در شرط داخل حلقه، مقدار صفر خواهد بود و مقدار برگشتی صفر به معنی اتمام فرایند ارسال از سمت Server می باشد. و در نهایت در خط شماره 29 اطلاعات دریافتی را از حالت کد شده به فرمت متنی تبدیل کرده و در خروجی نمایش می دهیم.


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


    تشریح برنامه سرویس دهنده (TCPEchoServer)


    در نسخه Server از این برنامه از فضای نام System.Net.Sockets به منظور استفاده از کلاس های TcpListener، TcpClient و NetworkStream و همچنین به منظور مدیریت استثناء های SocketException استفاده شده است.


    توسط objectی از کلاس TcpListener برنامه Server می تواند به درخواست های اتصال ورودی TCP به Server گوش فرادهد. در هنگام تعریف شی از این کلاس می توان یک واسط محلی (یک کارت شبکه بر روی کامپیوتر Server) و یک شماره پورت را جهت گوش دادن Server به اتصال های ورودی مشخص کرده و توسط متد Start() از این کلاس می توان فرایند گوش دادن را آغاز کرد. بعد از این، توسط متد AcceptTcpClient() از کلاس TcpListener که خروجی آن از نوع کلاس TcpClient() می باشد می توان اتصال های ورودی از سمت سرویس گیرنده ها را دریافت کرد و در ادامه با استفاده از متد GetSteam() می توان به کانال ارتباطی که بین سرویس گیرنده و سرویس دهنده ایجاد شده است دسترسی داشت و به ارسال و دریافت اطلاعات پرداخت.


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

    برنامه Server نیز همانطور که گفته شد یک Consol Application می باشد که در زیر به تحلیل تابع

    Main() برنامه می پردازیم

    کد:
    1 static void Main(string[] args) 2 { 3 byte[] byteBuffer = new byte[32]; // receive buffer 4 TcpListener listener = null; 5 try 6 { 7 // create a TcpListener to accept client connections 8 listener = new TcpListener(IPAddress.Any, 8000); 9 listener.Start(); 10 } 11 // exit program, if server can not use port number 8000 12 catch (Exception err) 13 { 14 Console.WriteLine(err.ToString()); 15 Environment.Exit(0); 16 } 17 int byteRcvd = 0; // received byte count 18 // run forever, accepting and servicing connections 19 for (; ; ) 20 { 21 TcpClient client = null; // for each client connection 22 NetworkStream netStream = null; // for each connection stream 23 Console.WriteLine("Waiting for connections..."); 24 try 25 { 26 client = listener.AcceptTcpClient(); // get client connection 27 netStream = client.GetStream(); // get connection stream 28 Console.WriteLine("Handling client..."); 29 // receive until client closes connection, 30 // indicated by 0 return value 31 int totalByteRcvd = 0; 32 while ((byteRcvd = netStream.Read(byteBuffer, totalByteRcvd, 33 byteBuffer.Length - totalByteRcvd)) > 0) 34 { 35 netStream.Write(byteBuffer, 0, byteRcvd); 36 totalByteRcvd += byteRcvd; 37 } // end while 38 Console.WriteLine(totalByteRcvd + 39 " bytes received from client >>> " + 40 Encoding.ASCII.GetString(byteBuffer) + 41 "\r\n"); 42 // close the stream and socket. we are done with this client! 43 netStream.Close(); 44 client.Close(); 45 } // end try 46 catch (Exception err) 47 { 48 Console.WriteLine(err.ToString()); 49 netStream.Close(); 50 } // end catch 51 } // end for 52 } // end main method
    در خط شماره 3 یک آرایه از نوع بایت و با اندازه 32 تعریف می شود. برنامه Server از این آرایه برای ذخیره داده هایی که از Client دریافت می شود استفاده می کند. در خط شماره 4 تعریف اولیه شی listener از نوع کلاس TcpListener صورت می گیرد و در ادامه در خط شماره 8 از کد برنامه تعریف کامل این object انجام می شود. همانطور که مشاهده می شود سازنده کلاس TcpListener دو پارامتر دریافت می کند که پارامتر اول مشخص می کند که کامپیوتر Server به کدام کارت شبکه روی خودش گوش دهد. به عنوان مثال اگر دو عدد کارت شبکه با IPهای مختلف روی کامپیوتر Server وجود داشته باشد، با وارد کردن IP همان کارت شبکه مشخص می کنید که برنامه Server باید به درخواست های اتصال از کدام کارت شبکه توجه کند. و اما پارامتر دوم، این پارامتر مشخص می کند که برنامه Server به کدام پورت گوش دهد. این شماره پورت همان شماره پورتی است که برنامه Client باید شماره آنرا بداند تا بتواند به برنامه Server متصل شده و ارسال و دریافت Data انجام دهد. توجه داشته باشید که با این دستور ما در واقع یک سوکت در سمت Server ایجاد کرده ایم. در ادامه و در خط شماره 9 توسط متد start() از کلاس TcpListener فرایند گوش دادن به سوکت ایجاد شده آغاز می شود.


    با مشاهده به کد برنامه ملاحضه می کنید که کل فرایند ساختن سوکت در سمت Server در خطوط 5 الی 16 از کد قرار دارد و توسط بلاک های try و catch خطاهای آن مدیریت می شود. سازنده TcpListener در صورت عدم موفقیت در ساخت سوکت استثناء های ArgumentNullException و ArgumentOutOfRangeException را صادر می کند. در واقع برنامه Server اگر نتواند سوکت خود را ایجاد کند دیگر نمی تواند به عنوان یک Server برای Clientها وظیفه خود را انجام دهد، به همین خاطر در بلوک catch و در صورت عدم موفقیت Server در ساختن سوکت توسط دستور Environment.Exit(0) به اجرای برنامه خاتمه داده می شود.


    همانطور که مشاهده می شود کلیه کدهای خطوط 19 الی 51 درون یک حلقه بی پایان قرار دارند. توسط این دستورات متن ارسالی از Client دریافت شده و همان متن دوباره برای Client ارسال می گردد. این دستورات از این جهت در یک حلقه بینهایت قرار گرفته اند که برنامه Server بتواند تقاضاهای اتصال از چندین Client را مدیریت کند. یعنی تا وقتی که برنامه Server در حال اجرا است، با خاتمه یک برنامه Client می توانید باز هم برنامه Client دیگری را اجرا کنید. دقت داشته باشید که این برنامه در یک لحضه فقط می تواند به یک Client سرویس دهد.


    در خطوط 21 و 22 یک شی از نوع TcpClient برای مدیریت هر اتصال دریافتی و یک شی NetworkStream برای در دست گرفتن Stream و یا همان کانال ارتباطی بین Client و Server تعریف شده است. در صورتی که تقاضایی از سمت Clientی برای اتصال به Server وجود نداشته باشد اجرای برنامه Server با رسیدن به خط شماره 26 و در واقع با رسیدن به دستور AcceptTcpClient() متوقف می شود، که به این عمل بلوکه شدن گویند. متد AcceptTcpClient() با دریافت اولین تقاضای اتصال از سمت Client از حالت بلوکه خارج شده و در خط شماره 27 توسط متد GetStream() از شی client کانال ارتباطی بین Server و Client برقرار می گردد و به شی netStream تخصیص داده می شود.



    از این پس می توان کلیه اعمال ارسال و دریافت را توسط شی netStream انجام داد. در خطوط 32 الی 37 توسط یک حلقه while متن ارسالی از سمت Client توسط متد Read(…) از شی netStream دریافت شده و توسط متد Write(…) دوباره به Client ارسال می گردد. در خطوط 43 و 44 توسط متد Close() شی های client و netStream ، ارتباط و اتصال بین Server و Client قطع می گردد و دوباره دستورات حلقه for(; ; ) از ابتدا اجرا می شوند. یعنی در این حالت چنانچه Client دیگری منتظر اتصال بوده باشد، به همان ترتیب به آن پاسخ داده می شود و اگر تقاضایی نباشد دوباره Server به حالت بلوکه می رود.


    نويسنده :
    سیامک محمدی نژاد
    کارشناس کامپیوتر، نرم افزار
    برای داشتن چیزی که تا به حال نداشته اید
    باید کسی باشید که تا به حال نبوده اید

  6. کاربرانی که از پست مفید Bad Sector سپاس کرده اند.


اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

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

  1. تاپیک متالورژی
    توسط ghasem motamedi در انجمن مهندسی مواد و متالورژي
    پاسخ ها: 41
    آخرين نوشته: 12th January 2014, 02:52 PM
  2. بررسي گوشي KM900 Arena ال‌جي
    توسط hoora در انجمن LG
    پاسخ ها: 3
    آخرين نوشته: 21st February 2013, 05:56 PM
  3. Apple iPhone 3GS نسل سوم از یک اتفاق
    توسط Bad Sector در انجمن Apple
    پاسخ ها: 2
    آخرين نوشته: 11th April 2011, 08:43 PM
  4. پاکت پی سی با حداقل قیمت
    توسط Bad Sector در انجمن HTC
    پاسخ ها: 2
    آخرين نوشته: 4th February 2011, 09:23 PM
  5. واقعـه غـدیر و اهـمیت آن
    توسط kamanabroo در انجمن مقالات مذهبی
    پاسخ ها: 0
    آخرين نوشته: 24th November 2010, 06:36 PM

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

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

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