zoukankan      html  css  js  c++  java
  • 监听网络状态

    using System;
    using System.Threading;
    using System.Runtime.InteropServices;
    namespace NetWork
    {
        public sealed class NetworkHelper
        {
            #region 网络状态
    
            /// <summary>
            /// 监听计时器
            /// </summary>
            private Timer listenTimer;
    
    
            private static NetworkHelper instance;
    
            /// <summary>
            /// 监听间隔
            /// </summary>
            const int LISTEN_TIME_SPAN = 50000;
    
            //IsNetworkAlive Description
            const int NETWORK_ALIVE_LAN = 1;
            const int NETWORK_ALIVE_WAN = 2;
            const int NETWORK_ALIVE_AOL = 4;
    
            const int FLAG_ICC_FORCE_CONNECTION = 1;
    
    
            private NetworkHelper()
            {
    
            }
    
            static NetworkHelper()
            {
                instance = new NetworkHelper();
            }
    
    
            public static NetworkHelper GetNetworkHelperInstance()
            {
                return instance;
            }
    
            /// <summary>
            /// 检查网络是否连通,有延迟
            /// </summary>
            /// <param name="connectionDescription"></param>
            /// <param name="reservedValue"></param>
            [DllImport("wininet.dll")]
            private extern static bool InternetGetConnectedState(out int connectionDescription, int reservedValue);
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="lpszUrl">连接饿地址</param>
            /// <param name="dwFlags">FLAG_ICC_FORCE_CONNECTION</param>
            /// <param name="dwReserved">0</param>
            [DllImport("wininet.dll")]
            private extern static bool InternetCheckConnection(string lpszUrl, int dwFlags, int dwReserved);
    
            /// <summary>
            /// 检查网络是否连通,需要启动服务
            /// </summary>
            /// <param name="connectionDescription"></param>
            [DllImport("sensapi.dll")]
            private extern static bool IsNetworkAlive(out int connectionDescription);
    
            /// <summary>
            /// 检查是否能建立Internet连接,VISTA不可用
            /// </summary>
            /// <param name="dest"></param>
            /// <param name="ptr">0</param>
            [DllImport("sensapi.dll")]
            private extern static bool IsDestinationReachable(string dest, IntPtr ptr);
    
    
            /// <summary>
            /// 互联网是否可用
            /// </summary>
            /// <returns></returns>
            public bool IsInternetAlive()
            {
                int status;
                //检查网络是否可用
                if (IsNetworkAlive(out status))
                {
                    ////如果WAN可用,检查能否建立连接
                    //if (status == NETWORK_ALIVE_WAN)
                    //{
                    if (InternetCheckConnection("http://www.baidu.com", FLAG_ICC_FORCE_CONNECTION, 0) ||
                         InternetCheckConnection("http://www.sina.com.cn", FLAG_ICC_FORCE_CONNECTION, 0) ||
                         InternetCheckConnection("http://www.163.com", FLAG_ICC_FORCE_CONNECTION, 0))
                    {
                        return true; //如果能建立连接返回TRUE
                    }
                    else
                        return false;
                    //}
                    //else
                    //    return false;
                }
                return false;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public int CheckIntertNet()
            {
                int status;
                int connectionDescription;
                //检查网络是否可用
                if (IsNetworkAlive(out status))
                {
                    //如果WAN可用,检查能否建立连接
                    //if (status == NETWORK_ALIVE_WAN)
                    //{
                    if (InternetGetConnectedState(out connectionDescription, 0))
                    {
                        return 1; //如果能建立连接返回TRUE
                    }
                    else
                        return 0;
                    //}
                    //else
                    //    return false;
                }
                return 0;
            }
    
            /// <summary>
            /// 为NetworkStatusChanged事件处理程序提供数据
            /// </summary>
            public class NetworkChangedEventArgs : EventArgs
            {
                private bool Isnetworkalive;
                int Isnetworkalive_Int32;
                public NetworkChangedEventArgs(bool status)
                {
                    Isnetworkalive = status;
                }
                public NetworkChangedEventArgs(int status)
                {
                    Isnetworkalive_Int32 = status;
                }
    
                public bool IsNetworkAlive
                {
                    get { return Isnetworkalive; }
                    private set { Isnetworkalive = value; }
                }
                public int IsNetworkAlive_Int32
                {
                    get { return Isnetworkalive_Int32; }
                    private set { Isnetworkalive_Int32 = value; }
                }
            }
    
            /// <summary>
            /// 表示NetworkStatusChanged事件的方法
            /// </summary>
            public delegate void NetworkChangedEventHandler(object sender, NetworkChangedEventArgs e);
    
            /// <summary>
            /// 网络状态变更时触发的事件
            /// </summary>
            public event NetworkChangedEventHandler NetworkStatusChanged;
    
            /// <summary>
            /// 网络状态变更时触发的事件
            /// </summary>
            private void OnNetworkStatusChanged(NetworkChangedEventArgs e)
            {
                if (NetworkStatusChanged != null)
                    NetworkStatusChanged(this, e);
            }
    
    
            /// <summary>
            /// 监听网络状态
            /// </summary>
            public void ListenNetworkStatus(SynchronizationContext context)
            {
                //获得当前网络状态,并通知
    
                bool currentStatus = true;
                //bool currentStatus = IsInternetAlive();
    
    
                //OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus));
    
                //启动监听网络状态,LISTEN_TIME_SPAN秒钟检查一次,当状态变更时触发事件
                AutoResetEvent autoEvent = new AutoResetEvent(false);
                listenTimer = new Timer(delegate
                                        {
                                            bool tmpStatus = IsInternetAlive();
                                            if (currentStatus != tmpStatus)
                                            {
                                                currentStatus = tmpStatus;
                                                context.Post(delegate
                                                {
                                                    OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus));
                                                }, null);
                                                //OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus));
                                            }
                                        }
                                        , autoEvent
                                        , 0
                                        , LISTEN_TIME_SPAN);
                //autoEvent.WaitOne(5000, false);        
            }
            /// <summary>
            /// 监听网络状态
            /// </summary>
            public void ListenNetworkStatus(SynchronizationContext context, bool? b)
            {
                //获得当前网络状态,并通知
    
                int currentStatus = -1;
                OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus));
    
                //启动监听网络状态,LISTEN_TIME_SPAN秒钟检查一次,当状态变更时触发事件
                AutoResetEvent autoEvent = new AutoResetEvent(false);
                listenTimer = new Timer(delegate
                                        {
                                            int tmpStatus = CheckIntertNet();
                                            if (currentStatus != tmpStatus)
                                            {
                                                currentStatus = tmpStatus;
                                                context.Post(delegate
                                                {
                                                    OnNetworkStatusChanged(new NetworkChangedEventArgs(currentStatus));
                                                }, null);
                                            }
                                        }
                                        , autoEvent
                                        , 0
                                        , LISTEN_TIME_SPAN);
                autoEvent.WaitOne(5000, false);
            }
    
    
            /// <summary>
            /// 停止监听网络状态
            /// </summary>
            public void CloseListenNetworkStatus()
            {
                listenTimer.Dispose();
            }
        }
            #endregion
    
    }
    

      

  • 相关阅读:
    导航
    占位
    django(一)
    进程与线程
    网络编程
    反射 单例模式
    面向对象及命名空间
    logging,包
    模块(二)os hashlib
    装饰器&递归
  • 原文地址:https://www.cnblogs.com/gcr1314/p/4038478.html
Copyright © 2011-2022 走看看