c# - 确定互联网连接是否可用

标签 c# .net networking

我知道我不是第一个问这个问题的人:我如何知道我的申请是否在线? 我找到了这篇文章:StackOverflow . 我想用 C# 和 .NET 3.5 来完成。

建议定期对资源执行 ping 操作。我对这个建议不是很满意。我宁愿检测网络变化,然后 ping 我的服务以检查它是否在线。

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

第一个事件听起来不错,但只有在最后一个在线的网卡离线时才会触发。我有几个由 VMWare 安装的虚拟网卡,它们始终在线。 第二个事件有效,但在插入网络电缆和事件之间,通常有 5 秒的等待时间。 当我拔下电缆时,Windows 托盘图标或多或少会立即使用react。 与此托盘图标一样快的最佳方法是什么?

我的解决方法是轮询 网络接口(interface).GetAllNetworkInterfaces() 每 500 毫秒并抛出我自己的事件以防网络适配器的状态发生变化。

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

最佳答案

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

而且:它以闪电般的速度工作。我的应用程序现在的 react 与托盘一样快。 该代码远非生产代码,它只是一个快速破解。但这是我现在要建立的:)

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

关于c# - 确定互联网连接是否可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1859799/

相关文章:

c# - 无法枚举 C# 中的 F# 列表列表

c# - 从异步方法返回输出时推荐的方法签名?

c# - 为什么将图像写入流会产生与直接保存到文件不同的结果?

互联网上的 iOS Bonjour

c - recvfrom() 错误 10035 使用非阻塞套接字

c# - 在最终等待之前从异步方法返回是否可以?

c# - "HEAD"作为请求方法是否足以检查站点是否可达

android - Android如何获取HTTP请求?

c# - 禁用或灰显 DataGridView

c# - 检查剪贴板中是否有复制的文本