2009-02-03 39 views
9

Tôi là một chút người mới để phát triển mạng C# /., Nhưng tôi đã tập hợp một ứng dụng theo dõi chứng khoán cho một tập hợp tài sản nhỏ trong công ty của tôi. Tôi cũng đã thiết lập cơ sở dữ liệu nó kết nối đến trong SQL 2000.Cách dễ nhất để xác minh có kết nối mạng có sẵn là gì?

Nó hiện hoạt động rực rỡ khi có kết nối mạng, nhưng tôi muốn mở rộng nó để sử dụng khi tôi không có kết nối.

Trước hết, tôi cần biết liệu có kết nối không. Vì vậy, tôi đặt này với nhau:

private int availableNetAdapters() 
    { 
     int nicCount = 0; 
     foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      if (nic.OperationalStatus == OperationalStatus.Up) 
      { 
       nicCount++; 
      } 
     } 

     return nicCount; 
    } 

vẻ để làm việc, nhưng tôi phải kiểm tra "> 1" như một cái gì đó như "giao diện MS TCP Loopback" luôn được phát hiện không phụ thuộc vào sates bộ chuyển đổi khác.

Có cách nào tốt hơn/dễ dàng hơn để kiểm tra kết nối không?

G

Trả lời

9

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

Bạn cũng có thể sử dụng các sự kiện NetworkAvailabilityChangedNetworkAddressChanged trong lớp đó để theo dõi địa chỉ IP và thay đổi khả dụng của mạng.

EDIT: Hãy lưu ý rằng phương pháp này kiểm tra tất cả các giao diện mạng khả dụng có thể có trên máy tính (không dây, lan, v.v.). Nếu bất kỳ ai trong số họ được kết nối, nó sẽ trở lại đúng sự thật.

+2

Đúng tôi nếu tôi sai, nhưng sẽ không liệt kê bluetooth này? Điều đó dường như là một kết quả không mong muốn. – TheSmurf

+0

Chỉ cần googled rằng, và có vẻ bạn đang phải. – Luke

8

Một số điều hơn để nhớ:

  • Kết nối mạng avaialable = kết nối internet có sẵn.
  • truy cập internet! = Truy cập đến một trang web cụ thể (nghĩ lọc proxy, hoặc các trang web chỉ có thể là xuống)

Do đó nó thường tốt nhất để kiểm tra quyền truy cập vào các tài nguyên cụ thể mà bạn cần trực tiếp.

Các tài nguyên này dễ bay hơi; bạn phải xử lý các ngoại lệ khi họ đi xuống anyway. Vì vậy, thường tốt nhất là chỉ cần đi lấy một nguồn tài nguyên như thể bạn biết chắc chắn nó tồn tại và đặt thời gian phát triển của bạn vào để đảm bảo trình xử lý ngoại lệ của bạn làm một công việc tốt đẹp với các lỗi.

+0

Cảm ơn lời nhắc. Hãy thử/nắm bắt xử lý là cách tốt nhất để chọn có nên điều chỉnh chương trình của tôi ở chế độ ngoại tuyến không? Tôi sẽ xem xét một phương pháp để lưu trữ dữ liệu này ngoại tuyến theo đúng khóa học nhưng hãy tự mình làm việc này :-) –

+0

$ 0,02 của tôi là lần đầu tiên bạn gặp lỗi, nhắc người dùng nếu họ muốn thử lại hoặc đi vào chế độ ngoại tuyến. nếu họ chuyển sang chế độ ngoại tuyến, hãy ở chế độ ngoại tuyến cho đến khi họ nhấp vào nút để thử truy cập lại trực tuyến. – rmeador

0

Chúng tôi có một ứng dụng chạy chủ yếu trong xe cảnh sát được kết nối qua thẻ không dây không dây. Chúng tôi cần một cách để xác định xem họ có được kết nối hay không. Chúng tôi đã viết một lớp Ping.cs rất nhỏ ping một IP hoặc tên máy tính định trước trong một khoảng thời gian đều đặn. Chúng tôi diễn giải thông báo kết quả và thay đổi hiển thị biểu tượng kết nối khay hệ thống. Nếu bạn muốn tôi có thể gửi cho bạn mã C#.

+0

Có, xin vui lòng, tôi muốn xem mã đó rất hữu ích với tôi –

+0

Tôi sẽ xóa sạch và đăng nó ở đây. Hy vọng rằng nó sẽ được đăng trong một ngày tùy thuộc vào khối lượng công việc của tôi. –

+0

Sẽ không rơi xuống nếu máy tính đó đã bị xóa vì lý do nào đó? Tôi hy vọng bạn có tài liệu tốt rằng nó được yêu cầu để được lên cho hệ thống để tiếp tục làm việc. –

4

Đây là lớp

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.Diagnostics; 

namespace Ping 
{  
    public readonly int iSent = 0; 
    public readonly int iReceived = 0; 
    public readonly int iLost = 0; 

    public PingReceivedArgs (int iSent, int iReceived, int iLost) 
    { 
     this.iSent = iSent; 
     this.iReceived = iReceived; 
     this.iLost = iLost; 
    } 

    public class PingFailedArgs : EventArgs 
    { 
     public readonly int iSent = 0; 
     public readonly int iReceived = 0; 
     public readonly int iLost = 0; 

     public PingFailedArgs (int iSent, int iReceived, int iLost) 
     { 
      this.iSent = iSent; 
      this.iReceived = iReceived; 
      this.iLost = iLost; 
     } 
    } 

/// <summary> 
/// The Main Ping Class 
/// </summary> 
public class Ping 
{ 
     //Create delegate for events 
      public delegate void PingReceivedHandler(object DataObj, PingReceivedArgs PingReceived); 
     public delegate void PingFailedHandler(object DataObj, PingFailedArgs PingFailed); 

    //The events we publish 
    public event PingReceivedHandler OnPingReceived; 
    public event PingFailedHandler OnPingFailed; 

    private void FirePingReceivedEvent(int iSent, int iReceived, int iLost) 
    { 
     PingReceivedArgs NewStatus = new PingReceivedArgs(iSent, iReceived, iLost); 
     if (OnPingReceived != null) 
     { 
      OnPingReceived(this,NewStatus); 
     } 
    } 

    private void FirePingFailedEvent(int iSent, int iReceived, int iLost) 
    { 
     PingFailedArgs NewStatus = new PingFailedArgs(iSent, iReceived, iLost); 
     if (OnPingFailed != null) 
     { 
      OnPingFailed(this,NewStatus); 
     } 
    } 


    private string _Host = ""; 
    private bool _HostFound = false; 
    private int _PingSent = 0; 
    private int _PingReceived = 0; 
    private int _PingLost = 0; 
    private int _PauseBetweenPings = 2000; 
    private Thread _PingThread; 

    public string Host 
    { 
     get { return _Host; } 
     set { _Host = value; } 
    } 
    public bool HostFound 
    { 
     get { return _HostFound; } 
    } 
    public int PingSent 
    { 
     get { return _PingSent; } 
    } 
    public int PingReceived 
    { 
     get { return _PingReceived; } 
    } 
    public int PingLost 
    { 
     get { return _PingLost; } 
    } 

    public int PauseBetweenPings 
    { 
     get { return _PauseBetweenPings; } 
     set { _PauseBetweenPings = value; } 
    } 

    public Ping() 
    { 
     // 
     // TODO: Add constructor logic here 
     // 
    } 

    public void StartPinging() 
    { 
     try 
     { 
      if (_Host.Length == 0) 
      { 
       //LogStatus.WriteLog("Host name is blank, stopping.","Error","StartPinging"); 
       return; 
      } 


       if (_PingThread == null || (_PingThread.ThreadState & (System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.Background)) == 0) 
      { 

       _PingThread = new Thread(new ThreadStart(LoopAndPing)); 
       _PingThread.IsBackground = true; 
       _PingThread.Start(); 
      } 
     } 
     catch(Exception ex)  
     { 
      //LogStatus.WriteErrorLog(ex,"Error","StartPinging"); 
     } 
    } 

    public void StopPinging() 
    { 
     try 
     { 
       if (_PingThread != null && (_PingThread.ThreadState & (System.Threading.ThreadState.Stopped | System.Threading.ThreadState.Aborted | System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.AbortRequested)) == 0) 
      { 
       _PingThread.Abort(); 
       _PingThread.Join(); 
      } 
     } 
     catch (Exception ex) 
     { 
      //LogStatus.WriteErrorLog(ex, "Error", "StopPinging"); 
     } 
    } 

    /// <summary> 
    /// LoopAndPing: Runs from a thread. Basically loops and gathers stats. 
    /// </summary> 
    private void LoopAndPing() 
    { 
     bool bHostFound = false; 

     try 
     { 
      while(true) 
      { 
       _PingSent++; 
       bHostFound = PingHost(_Host); 
       if (bHostFound) 
       { 
        _PingReceived++; 
        _HostFound = true; 
         FirePingReceivedEvent(_PingSent,_PingReceived,_PingLost); 
       } 
       else 
       { 
        _PingLost++; 
        _HostFound = false; 
         FirePingFailedEvent(_PingSent,_PingReceived,_PingLost); 
       } 
       Thread.Sleep(_PauseBetweenPings); 
      } 
     } 
     catch(ThreadAbortException) 
     { 
      //No need to do anything! 
     } 
     catch(Exception e) 
     { 
      //LogStatus.WriteErrorLog(e,"Error","LoopAndPing"); 
     } 
    } 

    /// <summary> 
    /// PingHost - Send one ping to the host 
    /// </summary> 
    /// <param name="host">Can be an IP or Host name.</param> 
    /// <returns></returns> 
    public bool PingHost(string szHost) 
    { 
     bool bPingWorked = false; 

     try 
     { 
      string szCommand = "ping " + szHost + " -n 1"; 
      Process p = new Process(); 
      p.StartInfo.FileName = "cmd.exe"; 
      p.StartInfo.Arguments = "/Q /A /C" + szCommand; 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.RedirectStandardOutput = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.CreateNoWindow = true; 
      p.Start(); 
      string szCommandOutput = p.StandardOutput.ReadToEnd(); 
      p.WaitForExit(); 

      if (szCommandOutput.ToUpper().IndexOf("REPLY FROM") > -1) 
      { 
       bPingWorked = true; 
      } 
     } 
     catch(ThreadAbortException) 
     { 
      //No need to do anything! 
     } 
     catch(Exception e) 
     { 
      //LogStatus.WriteErrorLog(e,"Error","PingHost"); 
     } 
     return bPingWorked; 
    } 
} 
} 

Từ Client bạn sẽ gọi

PingHost = new Ping(); 
PingHost.OnPingFailed += new Ping.PingFailedHandler(PingHost_OnPingFailed); 
PingHost.OnPingReceived +=new Ping.PingReceivedHandler(PingHost_OnPingReceived); 
PingHost.Host = *IP you wish to ping*; 
PingHost.StartPinging(); 

Sau đó, bạn sẽ mã lên phương pháp để nắm bắt các sự kiện PingHost của định nghĩa ở trên

private void PingHost_OnPingReceived(object DataObj, PingReceivedArgs PingReceived) 
{ 
    try 
    { 
     // code to do something when a successful ping occurrs 
    } 
    catch (Exception ex) 
    { 
     // code to do something when an exception occurrs 
    } 
} 

private void PingHost_OnPingFailed(object DataObj, PingFailedArgs PingFailed) 
{ 
    try 
    { 
      // code to do something when a ping failure occurrs 
    } 
    catch (Exception ex) 
    { 
      // code to do something when an exception occurrs 
    } 
} 
+0

Thật tuyệt vời! Excelenct, cảm ơn bạn rất nhiều. Tôi sẽ xem xét điều này trong vài ngày tới. –

Các vấn đề liên quan