C#判斷網卡是否可用

xf3f 10年前發布 | 1K 次閱讀 C#

微軟提供的函數不能再多網卡的情況下,判斷指定網卡的網線連接狀態。以下代碼剛好能夠解決這個問題。

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;
using System.Threading;

namespace NetworkAdapterTestEvent { class Program { static void Main(string[] args) { NetworkAdapterAvailable newtest = new NetworkAdapterAvailable();

        newtest.Subscribe("本地連接",new NetworkAdapterAvailable.NetworkAdapterChangedEventHandler(NetowrkAdapter_changed));
        newtest.StartMonitor();

        Console.ReadLine();
        newtest.StopMonitor();
        newtest.Unsubscribe("本地連接", new NetworkAdapterAvailable.NetworkAdapterChangedEventHandler(NetowrkAdapter_changed));
    }

    static void NetowrkAdapter_changed(object sender, NetworkAdapterChangedArgument e)
    {
        Console.WriteLine("Name:{0}\\tStatus:{1}", e.AdapterName, e.AdapterStatus.ToString());
    }
}

public class NetworkAdapterAvailable
{
    public delegate void NetworkAdapterChangedEventHandler(object send , NetworkAdapterChangedArgument e);

    public event NetworkAdapterChangedEventHandler NetworkAdapterChanged;

    private Thread _AdapterCheckThread;
    private string _AdapterName;
    private bool _Stop = false;
    private NetworkInterface[] _adapters;

    public NetworkAdapterAvailable()
    {
        _adapters = NetworkInterface.GetAllNetworkInterfaces();
    }

    /// <summary>
    /// 訂閱
    /// </summary>
    /// <param name="_adaptername_"></param>
    /// <param name="_EventHandler_"></param>
    public void Subscribe(string _adaptername_ , NetworkAdapterChangedEventHandler _EventHandler_)
    {
        _AdapterName = _adaptername_;

        if (_EventHandler_ != null)
        {
            NetworkAdapterChanged += _EventHandler_;
        }
    }

    /// <summary>
    /// 取消訂閱
    /// </summary>
    /// <param name="_adaptername_"></param>
    /// <param name="_EventHandler_"></param>
    public void Unsubscribe(string _adaptername_, NetworkAdapterChangedEventHandler _EventHandler_)
    {
        if (_EventHandler_ != null)
        {
            NetworkAdapterChanged -= _EventHandler_;
        }
    }

    /// <summary>
    /// 開始監控
    /// </summary>
    public void StartMonitor()
    {
        _AdapterCheckThread = new Thread(new ThreadStart(AdapterCheckHandler));
        _AdapterCheckThread.IsBackground = true;
        _AdapterCheckThread.Start();
    }

    public void StopMonitor()
    {
        _Stop = true;

        if (_AdapterCheckThread != null)
        {
            _AdapterCheckThread.Join();
        }

    }

    private void AdapterCheckHandler()
    {
        while (!_Stop)
        {
            NetworkInterface[] __adapters = NetworkInterface.GetAllNetworkInterfaces();

            for (int i = 0; i < __adapters.Length; i++)
            {
                if (_adapters[i].Name == _AdapterName)
                {
                    if (_adapters[i].OperationalStatus != __adapters[i].OperationalStatus)
                    {
                        NetworkAdapterChanged(this, new NetworkAdapterChangedArgument(_AdapterName, __adapters[i].OperationalStatus));
                        _adapters[i] = __adapters[i];
                    }
                }
            }

            Thread.Sleep(100);
        }
    }
}

public class NetworkAdapterChangedArgument : EventArgs
{
    private string _AdapterName;
    private OperationalStatus _AdapterStatus;

    public NetworkAdapterChangedArgument(string _adaptername_, OperationalStatus _adapterstatus_)
    {
        _AdapterName = _adaptername_;
        _AdapterStatus = _adapterstatus_;
    }

    public string AdapterName
    {
        get { return _AdapterName; }
    }

    public OperationalStatus AdapterStatus
    {
        get { return _AdapterStatus; }
    }
}

}

</pre>

 本文由用戶 xf3f 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!