我需要一个事件来检测 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 断开连接