⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 impsnetworkchange.cs

📁 破解的飞信源代码
💻 CS
字号:
namespace Imps.Utils
{
    using Imps.Client.Base;
    using System;
    using System.Collections.Generic;
    using System.Net;
    using System.Net.NetworkInformation;
    using System.Runtime.CompilerServices;

    public class IMPSNetworkChange
    {
        private Dictionary<string, OperationalStatus> _adapterStatus = new Dictionary<string, OperationalStatus>();
        private static IMPSNetworkChange _instance = null;
        private static object _lock = new object();
        private volatile bool _networkError;

        public event NetworkAddressChangedEventHandler NetworkAddressChanged;

        public event NetworkAvailabilityChangedEventHandler NetworkAvailabilityChanged;

        public event EventHandler NetworkRestored;

        private IMPSNetworkChange()
        {
            this.InitEventHandler();
            this.InitAdatperStatus();
        }

        public NetworkInterface GetAdapterByIP(IPEndPoint ipEndPoint)
        {
            List<NetworkInterface> physicNetworkInterfaces = this.GetPhysicNetworkInterfaces();
            NetworkInterface interface2 = null;
            try
            {
                List<NetworkInterface>.Enumerator enumerator = physicNetworkInterfaces.GetEnumerator();
                try
                {
                    while (enumerator.MoveNext())
                    {
                        NetworkInterface interface3 = enumerator.get_Current();
                        using (IEnumerator<UnicastIPAddressInformation> enumerator2 = interface3.GetIPProperties().get_UnicastAddresses().GetEnumerator())
                        {
                            while (enumerator2.MoveNext())
                            {
                                if (enumerator2.get_Current().get_Address().ToString() == ipEndPoint.Address.ToString())
                                {
                                    interface2 = interface3;
                                    goto Label_006F;
                                }
                            }
                        }
                    Label_006F:
                        if (interface2 != null)
                        {
                            return interface2;
                        }
                    }
                    return interface2;
                }
                finally
                {
                    enumerator.Dispose();
                }
            }
            catch
            {
            }
            return interface2;
        }

        private List<NetworkInterface> GetPhysicNetworkInterfaces()
        {
            List<NetworkInterface> list = new List<NetworkInterface>();
            try
            {
                foreach (NetworkInterface interface2 in NetworkInterface.GetAllNetworkInterfaces())
                {
                    if ((interface2.get_NetworkInterfaceType() != 0x18) && (interface2.get_NetworkInterfaceType() != 1))
                    {
                        list.Add(interface2);
                    }
                }
            }
            catch
            {
            }
            return list;
        }

        private void InitAdatperStatus()
        {
            List<NetworkInterface> physicNetworkInterfaces = this.GetPhysicNetworkInterfaces();
            try
            {
                for (int i = 0; i < physicNetworkInterfaces.get_Count(); i++)
                {
                    this.TryAddAdapterStatus(physicNetworkInterfaces.get_Item(i).get_Id(), physicNetworkInterfaces.get_Item(i).get_OperationalStatus());
                }
            }
            catch (Exception)
            {
            }
        }

        private void InitEventHandler()
        {
            if (Environment.OSVersion.Version >= OS.Windows2000)
            {
                try
                {
                    NetworkChange.add_NetworkAddressChanged(new NetworkAddressChangedEventHandler(this, (IntPtr) this.NetworkChange_NetworkAddressChanged));
                    NetworkChange.add_NetworkAvailabilityChanged(new NetworkAvailabilityChangedEventHandler(this, (IntPtr) this.NetworkChange_NetworkAvailabilityChanged));
                }
                catch
                {
                }
            }
        }

        private void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
        {
            ConnectionFactory.Reset();
            List<NetworkInterface> physicNetworkInterfaces = this.GetPhysicNetworkInterfaces();
            bool flag = false;
            List<NetworkInterface>.Enumerator enumerator = physicNetworkInterfaces.GetEnumerator();
            try
            {
                while (enumerator.MoveNext())
                {
                    NetworkInterface interface2 = enumerator.get_Current();
                    if (interface2.get_OperationalStatus() == 1)
                    {
                        if (this._adapterStatus.ContainsKey(interface2.get_Id()))
                        {
                            if (this._adapterStatus.get_Item(interface2.get_Id()) != interface2.get_OperationalStatus())
                            {
                                this.NetworkError = false;
                                flag = true;
                            }
                            this._adapterStatus.set_Item(interface2.get_Id(), interface2.get_OperationalStatus());
                        }
                        else
                        {
                            if (interface2.get_OperationalStatus() == 1)
                            {
                                this.NetworkError = false;
                            }
                            this._adapterStatus.Add(interface2.get_Id(), interface2.get_OperationalStatus());
                            flag = true;
                        }
                    }
                    else
                    {
                        if (this._adapterStatus.ContainsKey(interface2.get_Id()))
                        {
                            if (this._adapterStatus.get_Item(interface2.get_Id()) != interface2.get_OperationalStatus())
                            {
                                flag = true;
                            }
                            this._adapterStatus.set_Item(interface2.get_Id(), interface2.get_OperationalStatus());
                        }
                        else
                        {
                            this._adapterStatus.Add(interface2.get_Id(), interface2.get_OperationalStatus());
                            flag = true;
                        }
                        this.NetworkError = true;
                    }
                }
            }
            finally
            {
                enumerator.Dispose();
            }
            string[] textArray = new string[this._adapterStatus.get_Keys().get_Count()];
            this._adapterStatus.get_Keys().CopyTo(textArray, 0);
            for (int i = 0; i < textArray.Length; i++)
            {
                bool flag2 = false;
                List<NetworkInterface>.Enumerator enumerator2 = physicNetworkInterfaces.GetEnumerator();
                try
                {
                    while (enumerator2.MoveNext())
                    {
                        NetworkInterface interface3 = enumerator2.get_Current();
                        if (textArray[i] == interface3.get_Id())
                        {
                            flag2 = true;
                            goto Label_019E;
                        }
                    }
                }
                finally
                {
                    enumerator2.Dispose();
                }
            Label_019E:
                if (!flag2)
                {
                    this._adapterStatus.set_Item(textArray[i], 2);
                    flag = true;
                    this.NetworkError = true;
                }
            }
            if (!flag && (this.NetworkRestored != null))
            {
                this.NetworkRestored(this, EventArgs.Empty);
            }
            if (this.NetworkAddressChanged != null)
            {
                this.NetworkAddressChanged.Invoke(sender, e);
            }
        }

        private void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
        {
            if (!e.get_IsAvailable())
            {
                this.NetworkError = true;
            }
            else
            {
                this.NetworkError = false;
            }
            if (this.NetworkAvailabilityChanged != null)
            {
                this.NetworkAvailabilityChanged.Invoke(sender, e);
            }
        }

        private void TryAddAdapterStatus(string id, OperationalStatus status)
        {
            try
            {
                if (!this._adapterStatus.ContainsKey(id))
                {
                    lock (this)
                    {
                        if (!this._adapterStatus.ContainsKey(id))
                        {
                            this._adapterStatus.Add(id, status);
                        }
                    }
                }
            }
            catch (Exception)
            {
            }
        }

        public static IMPSNetworkChange Instance
        {
            get
            {
                if (_instance == null)
                {
                    lock (_lock)
                    {
                        if (_instance == null)
                        {
                            _instance = new IMPSNetworkChange();
                        }
                    }
                }
                return _instance;
            }
        }

        public bool NetworkError
        {
            get
            {
                lock (_lock)
                {
                    return this._networkError;
                }
            }
            internal set
            {
                lock (_lock)
                {
                    if (this._networkError != value)
                    {
                        if ((this._networkError && !value) && (this.NetworkRestored != null))
                        {
                            try
                            {
                                this.NetworkRestored(null, EventArgs.Empty);
                            }
                            catch
                            {
                            }
                        }
                        this._networkError = value;
                    }
                }
            }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -