Winform网络异常检测

Winform网络异常检测

在这里插入图片描述

创建定时器 循环调用检测

// 网络检测
networkTimer.Enabled = true;
networkTimer.Interval = 3000;
networkTimer.Tick += NetworkTimer_Tick;

定时方法 panelControlNetworkError 只是一个 PanelControl 容器 界面要怎么展示 就怎么玩咯

/// <summary>
/// 定时检测网络状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void NetworkTimer_Tick(object sender, EventArgs e)
{
    Task.Run(() =>
    {
    	// 主要是这个方法  下面的只是枚举值的判断
        var status = GetInternetConStatus.GetNetConStatus("baidu.com");
        switch (status)
        {
            case NetStatus.None:
            case NetStatus.ModemAccessInternet:
            case NetStatus.NetworkCard:
                // 注意调用线程 转到UI线程 去执行
                SynchronizationContext.Current.Post(d =>
                {
                    if (Context.IsRunTime)
                {
                    panelControlNetworkError.Visible = false;
                }
                }, null);
                
                break;

            case NetStatus.Ununited:
            case NetStatus.ModemAccessInternetImpassability:
            case NetStatus.NetworkCardImpassability:
                // 注意调用线程 转到UI线程 去执行
                SynchronizationContext.Current.Post(d =>
                {
                    if (Context.IsRunTime)
                    {
                        panelControlNetworkError.Visible = true;
                    }
                }, null);

                break;

            default:
                break;
        }
    });
}
// 枚举
public enum NetStatus
{
    [Description("")] None = 0,
    [Description("网络未连接")] Ununited,
    [Description("采用调治解调器上网")] ModemAccessInternet,
    [Description("采用网卡上网")] NetworkCard,
    [Description("采用调治解调器上网,但是联不通指定网络")] ModemAccessInternetImpassability,
    [Description("采用网卡上网,但是联不通指定网络")] NetworkCardImpassability,
}

// 先调用系统的API 获取当前网络状态 如果网络错误 再用 Ping 的方式,精准度会比只用 Ping 稍微强一点 但是还是会出现
public static class GetInternetConStatus
{
    private const int INTERNET_CONNECTION_MODEM = 1;
    private const int INTERNET_CONNECTION_LAN = 2;

    [DllImport("winInet.dll")]
    private static extern bool InternetGetConnectedState(
        ref int dwFlag,
        int dwReserved
    );

    /// <summary>
    /// 判断网络的连接状态
    /// </summary>
    /// <returns>
    /// 网络状态(1-->未联网;2-->采用调治解调器上网;3-->采用网卡上网)
    ///</returns>
    public static NetStatus GetNetConStatus(string strNetAddress)
    {
        int dwFlag = default;
        if (!InternetGetConnectedState(ref dwFlag, 0))
        {
            //没有能连上互联网
            return NetStatus.Ununited;
        }

        if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0)
        {
            //采用调治解调器上网,需要进一步判断能否登录具体网站
            return PingNetAddress(strNetAddress) ? NetStatus.ModemAccessInternet : NetStatus.ModemAccessInternetImpassability;
        }

        if ((dwFlag & INTERNET_CONNECTION_LAN) != 0)
        {
            //采用网卡上网,需要进一步判断能否登录具体网站
            return PingNetAddress(strNetAddress) ? NetStatus.NetworkCard : NetStatus.NetworkCardImpassability;
        }

        return NetStatus.None;
    }

    /// <summary>
    /// ping 具体的网址看能否ping通
    /// </summary>
    /// <param name="strNetAdd"></param>
    /// <returns></returns>
    private static bool PingNetAddress(string strNetAdd)
    {
        var ping = new Ping();
        bool flag;
        try
        {
            var pr = ping.Send(strNetAdd, 3000);
            flag = pr.Status switch
            {
                IPStatus.TimedOut => false,
                IPStatus.Success => true,
                _ => false
            };
        }
        catch
        {
            flag = false;
        }

        return flag;
    }
}

如果有更精准的方式 请留个链接啥的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值