NEWS

[C#] Kiểm tra kết nối internet Realtime sử dụng Network List Manager của Windows

[C#] Kiểm tra kết nối internet Realtime sử dụng Network List Manager của Windows
Đăng bởi: Thảo Meo - Lượt xem: 14457 19:44:38, 09/08/2019C#   In bài viết

Xin chào các bạn, bài viết hôm nay mình sẽ hướng dẫn các bạn cách kiểm tra kết nối mạng internet realtime trong lập trình C# sử dụng thư viện Network List Manager (NLM) trong Windows.

[C#] How do I check if I have an Internet connection Realtime

Nếu bạn nào đang lập trình ứng dụng có kết nối internet để làm việc, như những ứng dụng gởi email marketing hàng loạt, curl website hay gởi tin nhắn qua mạng.

Thì chúng ta thường muốn kiểm tra xem kết nối mạng internet có bị sự cố gì hay không.

Nếu có sự cố mất kết nối mạng hoặc có kết nối mạng lại, thì sẽ hiển thị thông báo cho người dùng đang sử dụng phần mềm biết.

Hoặc mình có thể bắt sự kiện mất kết nối đó để xử lý một số yêu cầu theo mục đích của mình.

Thường các bạn muốn kiểm tra kết nối mạng Internet có bị sự cố hay không? các bạn sẽ nghĩ đến ngay là mình sẽ sử dụng một HttpRequest để ping đến một địa chỉ nào đó.

Giao diện demo ứng dụng kiểm tra kết nối internet Realtime C#:

detect internet realtime c#
Phần mềm kiểm tra kết nối mạng Internet C#

 

VD: như 8.8.8.8 Dns của google, nếu trả về Timeout thì chúng ta xuất thông báo.

Nhưng trong bài viết này, mình sẽ hướng dẫn các bạn sử dụng thư viện Network List Manager (NLM), thư viện này đi kèm trong bộ Visual Studio của Microsoft, giúp ta có thể lấy tình trạng kết nối internet realtime của windows.

Vậy sử dụng thư viện này mình sẽ bắt được sự kiện kiểm tra kết nối internet của Windows như hình bên dưới, nó kết nối internet qua hai địa chỉ ip: IP v4 và IP v6.

check_internet_status

Bây giờ mình sẽ bắt đầu thực hiện:

Đầu tiên các bạn tạo cho mình mới với tên NLM_Demo.

Sau đó, chúng ta sẽ tiến hành import thư viện NetWork List Manager vào project như hình bên dưới.

add_thuvien

Khi hộp thoại xuất hiện các bạn chọn Network List Manager 1.0 Type Library như hình bên dưới:

import_thuvien_network

 

Tiếp theo, các bạn tạo cho mình một class với tên CheckerInternetHelper.cs.

Và class này chúng ta sẽ implement interface INetworkListManagerEvents.

Source code file CheckerInternetHelper.cs C#:

using NETWORKLIST;
using System;
using System.Drawing;
using System.Runtime.InteropServices.ComTypes;


namespace NLM_Demo
{
    class CheckerInternetHelper: INetworkListManagerEvents
    {
        private int m_cookie = 0;
        private IConnectionPoint m_icp;
        private INetworkListManager m_nlm;
        private Form1 frm;

        public CheckerInternetHelper(Form1 frm)
        {
            m_nlm = new NetworkListManager();
            this.frm = frm;
        }

        public void SetText(string message, Color color, Color color2)
        {
            frm.label1.BeginInvoke(new Action(() => {
                frm.label1.Text = message;
                frm.label1.ForeColor = color;
                frm.label1.BackColor = color2;
                frm.flyoutPanel1.ShowPopup();
                frm.CountDownloadHidePopup();
            }));
        }

        public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity)
        {
            if (newConnectivity == NLM_CONNECTIVITY.NLM_CONNECTIVITY_DISCONNECTED)
            {
                SetText("Đã ngắt kết nối internet!", Color.White, Color.Red);
            }
            if (((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_INTERNET) != 0)
            {              
                SetText("Đang kết nối thành công Internet với IPv4!", Color.White, Color.Green);
            }
            if (((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV6_INTERNET) != 0)
            {
                SetText("Đang kết nối thành công Internet với IPv6!", Color.White, Color.Green);
            }
            if ((((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_INTERNET) == 0)
                && (((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV6_INTERNET) == 0))
            {
                SetText("Mất kết nối Internet!", Color.White, Color.Red);
            }
        }

        public INetworkListManager NLM
        {
            get
            {
                return m_nlm;
            }
        }

        public void AdviseforNetworklistManager()
        {            
            IConnectionPointContainer icpc = (IConnectionPointContainer)m_nlm;
            Guid tempGuid = typeof(INetworkListManagerEvents).GUID;
            icpc.FindConnectionPoint(ref tempGuid, out m_icp);
            m_icp.Advise(this, out m_cookie);
        }

        public void UnAdviseforNetworklistManager()
        {          
            m_icp.Unadvise(m_cookie);
        }
    }
}

+ Trong bài viết demo này, mình có sử dụng Flyout Panel của Devexpress để hiện thị thông báo.

Và mình có sử dụng một Timer để set cho popup này tự động đóng đi sau khoảng thời gian chúng ta quy định.

Tiếp theo là source code của Form1.cs C#

using DevExpress.XtraEditors;
using NETWORKLIST;
using System;
using System.Windows.Forms;

namespace NLM_Demo
{
    public partial class Form1 : DevExpress.XtraEditors.XtraForm
    {
        CheckerInternetHelper helper;
        public Form1()
        {
            InitializeComponent();
            helper = new CheckerInternetHelper(this);
        }

      

        private void Form1_Load(object sender, EventArgs e)
        {            
            label2.Text = "Mất kết nối mạng Internet!";
            IEnumNetworks Networks = helper.NLM.GetNetworks(NLM_ENUM_NETWORK.NLM_ENUM_NETWORK_CONNECTED);
            foreach (INetwork item in Networks)
            {
                label2.Text = "Đang kết nối mạng:" + item.GetName();
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            helper.UnAdviseforNetworklistManager();
        }

        public void CountDownloadHidePopup()
        {
            timer1.Enabled = true;
        }

        int i = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            i++;
            if (i == 10)
            {
                flyoutPanel1.HidePopup();
                i = 0;
                timer1.Enabled = false;
            }
        }

        private void btn_dangky_Click(object sender, EventArgs e)
        {
            helper.AdviseforNetworklistManager();
            XtraMessageBox.Show("Đã đăng ký kiểm tra kết nối mạng thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void btn_huydangky_Click(object sender, EventArgs e)
        {
            helper.UnAdviseforNetworklistManager();
            XtraMessageBox.Show("Đã hủy đăng ký kiểm tra kết nối mạng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

Hy vọng bài viết sẽ giúp ích được cho các bạn.

Video demo ứng dụng Detect Internet Realtime C#:

Thanks for watching!

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Kiểm tra kết nối internet Realtime sử dụng Network List Manager của Windows
Đăng bởi: Thảo Meo - Lượt xem: 14457 19:44:38, 09/08/2019C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.