我需要一个事件来检测 Internet 连接/断开连接

Posted

技术标签:

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

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

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

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

【问题讨论】:

另见:***.com/questions/6197954/… 【参考方案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

【讨论】:

以上是关于我需要一个事件来检测 Internet 连接/断开连接的主要内容,如果未能解决你的问题,请参考以下文章

Android InputStream Internet 断开连接

Web Socket:无法在 Internet 断开连接时检测到客户端连接

如何检测win32上的datacard连接和断开事件?

当互联网连接或断开时得到通知

如果外部 ADO 连接已连接或断开,如何检测组件内部?

websocket检测服务器是否断开-来游戏手游解答