2010-12-16 44 views
23

Chúng tôi đang phát triển một ứng dụng .NET trong đó một trong các yêu cầu là theo dõi xem hệ thống có được kết nối với Internet hay không.Tôi cần một sự kiện để phát hiện kết nối Internet/ngắt kết nối

Chúng tôi có thể nhận được sự kiện .NET cho "ngắt kết nối cáp ethernet", nhưng nếu modem được đặt lại thì sự kiện này sẽ không được kích hoạt. Tôi không muốn giữ một số URL để thực hiện điều này vì nó sẽ bổ sung thêm chi phí hiệu năng đáng kể. Có sự kiện .NET nào có thể kiểm tra xem hệ thống có được kết nối với Internet hay không?

Có một biểu tượng trong khay hệ thống hiển thị dấu chéo hoặc dấu hiệu kết nối giới hạn khi hệ thống không được kết nối với internet. Điều đó cho thấy Windows biết, và tôi muốn bẫy sự kiện đó.

+0

Xem thêm: http://stackoverflow.com/questions/6197954/get-windows-7s-network-status –

Trả lời

10

Tất cả điều này được bao gồm (bao gồm cả sự khác biệt giữa mạng và có mạng kết nối bạn với Internet) tại http://msdn.microsoft.com/en-us/library/ee264321(VS.85).aspx. Tôi hy vọng bạn có nghĩa là để đưa rằng Windows 7 tag trên bài viết của bạn, bởi vì tất cả điều này là khá mới.

Điều quan trọng là INetworkListManager.get_IsConnectedToInternet() thực hiện điều đó rất nhiều trên tin nhắn. Bạn phải nhảy xung quanh một chút để đăng ký cho các sự kiện vv. Code Pack kết thúc tốt đẹp một số điều đó cho bạn và có một mẫu mạng mà bạn có thể điều chỉnh.

+0

Cảm ơn bạn. Đó là một cách đọc hay đấy. Tôi chưa thực hiện chúng và kiểm tra xem nó có giải quyết được vấn đề của tôi hay không. – Nuetrino

0

bạn phải sử dụng WMI.

Đây là ví dụ cho phát hiện ngắt kết nối: (để kiểm tra nó tạo ra một tập tin vbs và chạy nó)

strComputer = "." 

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi") 
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ 
    ("Select * from MSNdis_StatusMediaDisconnect") 

    Do While True 
    Set strLatestEvent = colMonitoredEvents.NextEvent 
    Wscript.StdOut.Write "A network connection has been lost: " 
    Wscript.StdOut.Writeline strLatestEvent.InstanceName 
    Loop 
18

Bạn có thể sử dụng lớp NetworkChange, với NetworkAvailabilityChanged sự kiện:

NetworkChange.NetworkAvailabilityChanged += myNetworkAvailabilityChangeHandler; 

Vì đây là sự kiện hệ thống, hãy đảm bảo bạn xóa sự kiện khi bạn hoàn tất, xem bài đăng này tại đây: You need to be careful about using event handler for NetworkChange

+0

Cảm ơn trả lời của bạn. chúng tôi hiện đang cùng một sự kiện để ngắt kết nối mạng. Nhưng sự kiện này chỉ được kích hoạt khi cáp Ethernet bị xóa và không phải khi mạng bị hỏng do có thể đặt lại modem. Trong Windows-7, bạn có thể thấy biểu tượng khay hệ thống cho Kết nối Lan đôi khi hiển thị kết nối bị hạn chế với biểu tượng nguy hiểm, nó hiển thị Không có truy cập internet khi bạn thực hiện di chuột qua. và khi Internet được khôi phục thì nó lại kết nối lại. – Nuetrino

+1

Contd .. Tôi đã chỉ tò mò cho dù sự kiện cụ thể có thể bị mắc kẹt. Googled rất nhiều câu trả lời duy nhất là ping máy chủ và xem liệu nó được kết nối hay không và đó sẽ là một chi phí hiệu suất đáng kể cho các ứng dụng tôi loại trừ điều đó. – Nuetrino

+0

Thông báo "kết nối hạn chế" này rất phụ thuộc vào ngữ cảnh, ví dụ nếu bạn đang ở phía sau nhiều bộ định tuyến.Nếu bạn thực sự muốn biết nếu bạn đang "kết nối với internet", bạn cần phải xác định những gì bạn có nghĩa là do đó. Trong trường hợp chung, tốt nhất là kết nối với điểm cuối mà bạn quan tâm (có thể trong một chủ đề khác với bộ hẹn giờ). Cũng lưu ý rằng ping đôi khi bị cấm bởi tường lửa. Nếu bạn cần HTTP, bạn cần phải kiểm tra cổng 80, nếu bạn cần HTTPS, bạn cần phải kiểm tra 443, vv ... –

2

Điều này phù hợp với tôi!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net.NetworkInformation; 
namespace ConsoleApplication6 
{ 


    class Program 
    { 
     private void AvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
     { 

      if (e.IsAvailable) 
       Console.WriteLine("Network connected!"); 
      else 
       Console.WriteLine("Network dis connected!"); 
     } 
     public void Form1() 
     { 

      NetworkChange.NetworkAvailabilityChanged += AvailabilityChanged; 
     } 

     static void Main(string[] args) 
     { 
      Program p = new Program(); 

      p.Form1(); 

      Console.ReadLine(); 

     } 
    } 
} 
1

thử với điều này:

private void AvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
     { 
      if (e.IsAvailable) 
       Console.WriteLine("Wi-Fi conectado " + DateTime.Now); 
      else 
       Console.WriteLine("Wi-Fi desconectado " + DateTime.Now); 
     } 


     public Inicio() 
     { 
      InitializeComponent(); 

      NetworkAvailabilityChangedEventHandler myHandler = new NetworkAvailabilityChangedEventHandler(AvailabilityChanged); 
      NetworkChange.NetworkAvailabilityChanged += myHandler; 
     } 
Các vấn đề liên quan