【问题标题】:I need a event to detect Internet connect/disconnect我需要一个事件来检测 Internet 连接/断开连接
【发布时间】:2011-05-26 08:37:30
【问题描述】:

我们正在开发一个 .NET 应用程序,其中一项要求是监控系统是否连接到互联网。

我们能够获得“以太网电缆断开连接”的 .NET 事件,但如果调制解调器被重置,则不会触发此事件。我不想一直 ping 一些 URL 来完成这项工作,因为它会增加相当大的性能开销。是否有任何 .NET 事件可以检查系统是否连接到互联网?

系统托盘中有一个图标,当系统未连接到 Internet 时,该图标会显示十字符号或连接受限符号。这表明 Windows 知道,我想捕获该事件。

【问题讨论】:

标签: c# .net events windows-7


【解决方案1】:

我能够在一定程度上解决这个问题。我能够在代码项目中找到一些示例代码 http://www.codeproject.com/script/Articles/ListVersions.aspx?aid=34650。谢谢大家的回复。

尤其是Gregory女士发布的文章链接对我帮助很大。

【讨论】:

    【解决方案2】:

    试试这个:

    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;
            }
    

    【讨论】:

    • 这只是一个代码答案,请创建一个简短的描述应用程序做什么以及它是如何做的。
    【解决方案3】:

    这对我有用!

    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();
    
            }
        }
    }
    

    【讨论】:

    • 这只是一个代码答案,请创建一个简短的描述应用程序做什么以及它是如何做的。
    【解决方案4】:

    http://msdn.microsoft.com/en-us/library/ee264321(VS.85).aspx 涵盖了所有内容(包括在网络上和让网络将您连接到 Internet 之间的区别)。我希望您打算在您的帖子上贴上 Windows 7 的标签,因为这一切都是全新的。

    关键是INetworkListManager.get_IsConnectedToInternet(),它几乎做到了它在锡上所说的那样。您必须稍微跳一下才能注册事件等。Code Pack 为您包装了一些内容,并有一个您可以适应的网络示例。

    【讨论】:

    • 谢谢。那是一本好书。我还没有实施它们并检查它是否解决了我的问题。
    【解决方案5】:

    您可以将NetworkChange 类与NetworkAvailabilityChanged 事件一起使用:

    NetworkChange.NetworkAvailabilityChanged += myNetworkAvailabilityChangeHandler;
    

    由于是系统事件,请务必在完成后删除该事件,请在此处查看此帖子:You need to be careful about using event handler for NetworkChange

    【讨论】:

    • 感谢您的回复。我们目前是网络断开的同一事件。但此事件仅在移除以太网电缆时触发,而不是在网络因调制解调器重置而中断时触发。在 Windows-7 中,您可以看到 LAN 连接的系统托盘图标,有时会显示有限的连接并带有(危险符号),当您将鼠标悬停时会显示无互联网访问。当互联网恢复时,它会再次重新连接。
    • Contd..我只是好奇是否可以捕获特定事件。谷歌搜索了很多,唯一的回复是 ping 服务器并查看它是否已连接,这对于我排除的应用程序来说将是相当大的性能开销。
    • 此“连接受限”消息非常依赖于上下文,例如,如果您位于许多路由器后面。如果你真的想知道你是否“连接到互联网”,你需要定义你的意思。在一般情况下,最好是连接到您感兴趣的端点(可能在另一个带有计时器的线程中)。另请注意,防火墙有时会禁止 ping。如果需要HTTP,则需要测试80端口,如果需要HTTPS,则需要测试443等...
    【解决方案6】:

    你必须使用 WMI。

    这是断开检测的示例:(要对其进行测试,请创建一个 .vbs 文件并运行它)

     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
    

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多