2009-02-06 49 views

Trả lời

135

Bạn có thể kiểm tra kết nối mạng trong .NET 2.0 sử dụng GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

Theo dõi thay đổi địa chỉ IP hoặc thay đổi trong khả dụng của mạng sử dụng các sự kiện từ lớp NetworkChange:

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged 
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged 
+8

Điều này có quan tâm đến "tính khả dụng giới hạn" không? – tofutim

+0

Điều này không phải lúc nào cũng hoạt động trong WPF. Một số máy tính xách tay trở lại sai và một số trở lại đúng – krilovich

+0

Điều này thực sự làm việc? Tôi vừa viết dòng này và tắt bộ định tuyến của mình và vẫn trả về đúng! – Mushfiq

143

Câu trả lời được đánh dấu là 100% tiền phạt, tuy nhiên, có một số trường hợp khi phương pháp chuẩn bị lừa bởi thẻ ảo (hộp ảo, ...). Nó cũng thường được mong muốn để loại bỏ một số giao diện mạng dựa trên tốc độ của họ (cổng nối tiếp, modem, ...).

Dưới đây là một đoạn mã để kiểm tra đối với các trường hợp:

/// <summary> 
    /// Indicates whether any network connection is available 
    /// Filter connections below a specified speed, as well as virtual network cards. 
    /// </summary> 
    /// <returns> 
    ///  <c>true</c> if a network connection is available; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsNetworkAvailable() 
    { 
     return IsNetworkAvailable(0); 
    } 

    /// <summary> 
    /// Indicates whether any network connection is available. 
    /// Filter connections below a specified speed, as well as virtual network cards. 
    /// </summary> 
    /// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param> 
    /// <returns> 
    ///  <c>true</c> if a network connection is available; otherwise, <c>false</c>. 
    /// </returns> 
    public static bool IsNetworkAvailable(long minimumSpeed) 
    { 
     if (!NetworkInterface.GetIsNetworkAvailable()) 
      return false; 

     foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      // discard because of standard reasons 
      if ((ni.OperationalStatus != OperationalStatus.Up) || 
       (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) || 
       (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel)) 
       continue; 

      // this allow to filter modems, serial, etc. 
      // I use 10000000 as a minimum speed for most cases 
      if (ni.Speed < minimumSpeed) 
       continue; 

      // discard virtual cards (virtual box, virtual pc, etc.) 
      if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) || 
       (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0)) 
       continue; 

      // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card. 
      if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase)) 
       continue; 

      return true; 
     } 
     return false; 
    } 
+14

điều này là đúng và xứng đáng với nhiều upvotes - tôi thấy rằng sự kiện NetworkAvailabilityChanged được đề cập trong câu trả lời được chấp nhận không được bắn đáng tin cậy, có thể do bộ điều hợp ảo gây ra như đã đề cập trong câu trả lời – Marek

+1

+1 này cho việc kiểm tra bổ sung cho máy ảo. Chỉ cần chạy vào trường hợp này ngày hôm qua. Nhưng tôi vẫn nghĩ rằng điều này không xử lý 'Hype-V', do họ không có 'ảo' trong tên của họ. – Herdo

+1

@Herdo - vâng, mã không hoàn hảo, và tôi không nghĩ rằng * có thể * là bất kỳ thứ gì hoàn hảo trong thế giới ảo. Nhưng bạn có thể cải thiện nó. –

8

Microsoft windows vista và 7 sử dụng NCSI (Khả năng kết nối mạng Status Indicator) technic:

  1. NCSI thực hiện một tra cứu DNS trên www.msftncsi.com, sau đó yêu cầu http://www.msftncsi.com/ncsi.txt. Tệp này là một tệp văn bản thuần túy và chỉ chứa văn bản 'Microsoft NCSI'.
  2. NCSI gửi yêu cầu tra cứu DNS cho dns.msftncsi.com. Địa chỉ DNS này sẽ giải quyết thành 131.107.255.255. Nếu địa chỉ không khớp, thì giả định rằng kết nối internet không hoạt động chính xác.
+2

Điều này thật tuyệt, nhưng về mặt kỹ thuật không có tính khả dụng của 'mạng' nhưng nhiều hơn 'tôi có kết nối internet qua http không?' Bạn có thể có kết nối mạng hoàn hảo nhưng không có kết nối Internet, ví dụ trên một làn đường độc lập. Xem thêm thông tin om NCSI: http://technet.microsoft.com/en-us/library/cc766017.aspx – MichielB

1

Gọi phương thức này để kiểm tra kết nối mạng.

public static bool IsConnectedToInternet() 
     { 
      bool returnValue = false; 
      try 
      { 

       int Desc; 
       returnValue = Utility.InternetGetConnectedState(out Desc, 0); 
      } 
      catch 
      { 
       returnValue = false; 
      } 
      return returnValue; 
     } 

Đặt dòng mã bên dưới này.

[DllImport("wininet.dll")] 
     public extern static bool InternetGetConnectedState(out int Description, int ReservedValue); 
Các vấn đề liên quan