确定互联网连接是否可用

13 .net c# networking

我知道我不是第一个提出这个问题的人:我如何知道我的申请是否在线?我发现这篇文章:StackOverflow.我想用C#和.NET 3.5来做.

建议定期ping资源.我对这个建议不太满意.我宁愿检测网络更改,然后ping我的服务以检查它是否在线.

.NET为此提供了两个事件:NetworkChange.NetworkAvailabilityChanged NetworkChange.NetworkAddressChanged

第一个事件听起来不错,但只有当最后一个在线网卡脱机时才会触发.我有几个虚拟网卡已经由VMWare安装,并且总是在线.第二个事件有效,但在插入网络电缆和事件之间,通常有5秒的等待时间.当我拔下电缆时,Windows托盘图标会或多或少立即作出反应.像这个托盘图标一样快的最佳方法是什么?

我的解决方法是每500ms轮询一次NetworkInterface.GetAllNetworkInterfaces(),并在网络适配器的状态发生变化时抛出我自己的事件.

必须有一个更好的解决方案:)

小智 9

我尝试了Webleeuw建议的链接,但是当我插上或拔掉电缆时,该代码还需要4到10秒才能通知我.现在,我想知道它是否只是我的计算机或安装,我编写了自己的Observer类,它基于NetworkInterface.GetAllNetworkInterfaces().

并且:它以闪电般的速度工作.我的应用程序现在和托盘一样快.代码远离生产代码,它只是一个快速的黑客.但这就是我现在要建立的:)

using System;
using System.Net.NetworkInformation;
using Timer=System.Threading.Timer;

namespace NetworkCheckApp
{
public class NetworkStatusObserver
{
    public event EventHandler<EventArgs> NetworkChanged;

    private NetworkInterface[] oldInterfaces;
    private Timer timer;

    public void Start()
    {
        timer = new Timer(UpdateNetworkStatus, null, new TimeSpan(0, 0, 0, 0, 500), new TimeSpan(0, 0, 0, 0, 500));

        oldInterfaces = NetworkInterface.GetAllNetworkInterfaces();
    }

    private void UpdateNetworkStatus(object o)
    {
        var newInterfaces = NetworkInterface.GetAllNetworkInterfaces();
        bool hasChanges = false;
        if (newInterfaces.Length != oldInterfaces.Length)
        {
            hasChanges = true;
        }
        if (!hasChanges)
        {
            for (int i = 0; i < oldInterfaces.Length; i++)
            {
                if (oldInterfaces[i].Name != newInterfaces[i].Name || oldInterfaces[i].OperationalStatus != newInterfaces[i].OperationalStatus)
                {
                    hasChanges = true;
                    break;
                }
            }
        }

        oldInterfaces = newInterfaces;

        if (hasChanges)
        {
            RaiseNetworkChanged();
        }
    }

    private void RaiseNetworkChanged()
    {
        if (NetworkChanged != null)
        {
            NetworkChanged.Invoke(this, null);
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*zer 0

定期对您的资源执行 ping 操作是在服务脱机以及客户端脱机时向您发出通知的唯一选项。您可能想同时处理这两种情况。