Làm cách nào để kiểm tra kết nối mạng?


Câu trả lời:


153

Bạn có thể kiểm tra kết nối mạng trong .NET 2.0 bằng cách sử dụng GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

Để theo dõi những thay đổi về địa chỉ IP hoặc những thay đổi về tính khả dụng của mạng, hãy sử dụng các sự kiện từ lớp NetworkChange :

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

9
Điều này có quan tâm đến "số lượng có hạn" không?
tofutim

Điều này không phải lúc nào cũng hoạt động trong WPF. Một số máy tính xách tay trả về false và một số trở thành sự thật
krilovich

Điều này có thực sự hiệu quả? Tôi chỉ viết dòng này và tắt bộ định tuyến của tôi và vẫn trả về true!
Mushfiq

1
NetworkInterface.GetIsNetworkAvailable()rất không đáng tin cậy trong ứng dụng của tôi (.NET 4.5, Windows 10), đặc biệt khi chạy trong máy ảo. Xử lý các sự kiện từ NetworkAvailabilityChangedđã đáng tin cậy.
eskimwier 14/09/17

Điều đó không đáng tin cậy. đọc stackoverflow.com/a/25779403/2377343
T.Todua

174

Câu trả lời được đánh dấu là 100% tốt, tuy nhiên, có một số trường hợp khi phương pháp tiêu chuẩn bị đánh lừa bởi các thẻ ảo (ô ảo, ...). Bạn cũng thường muốn loại bỏ một số giao diện mạng dựa trên tốc độ của chúng (cổng nối tiếp, modem, ...).

Đây là một đoạn mã kiểm tra các trường hợp này:

    /// <summary>
    /// Indicates whether any network connection is available
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// </summary>
    /// <returns>
    ///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNetworkAvailable()
    {
        return IsNetworkAvailable(0);
    }

    /// <summary>
    /// Indicates whether any network connection is available.
    /// Filter connections below a specified speed, as well as virtual network cards.
    /// </summary>
    /// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
    /// <returns>
    ///     <c>true</c> if a network connection is available; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsNetworkAvailable(long minimumSpeed)
    {
        if (!NetworkInterface.GetIsNetworkAvailable())
            return false;

        foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
        {
            // discard because of standard reasons
            if ((ni.OperationalStatus != OperationalStatus.Up) ||
                (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
                (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
                continue;

            // this allow to filter modems, serial, etc.
            // I use 10000000 as a minimum speed for most cases
            if (ni.Speed < minimumSpeed)
                continue;

            // discard virtual cards (virtual box, virtual pc, etc.)
            if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) ||
                (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0))
                continue;

            // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
            if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
                continue;

            return true;
        }
        return false;
    }

17
điều này là đúng và xứng đáng nhiều upvotes - Tôi thấy rằng sự kiện NetworkAvailabilityChanged đề cập trong câu trả lời được chấp nhận là không đáng tin cậy bị sa thải, mà có lẽ là do adapter ảo như đã đề cập trong câu trả lời này
Marek

1
+1 để kiểm tra bổ sung cho máy ảo. Mới gặp trường hợp này ngày hôm qua. Nhưng tôi vẫn nghĩ điều này không xử lý được 'Hype-V', vì họ không có 'ảo' trong tên của họ.
Herdo

3
@Herdo - vâng, mã không hoàn hảo và tôi không nghĩ rằng có thể có bất cứ thứ gì hoàn hảo trong thế giới ảo. Nhưng bạn có thể cải thiện nó.
Simon Mourier

@SimonMourier Bạn nói đúng. Chỉ muốn lưu ý rằng, nếu ai đó vẫn trả về true, nếu không có kết nối -> Đây có thể là vấn đề :)
Herdo

1
@noelicus - Trong các dự án mà tôi đang làm cho đến nay, tôi đã triển khai hệ thống theo dõi / thăm dò định kỳ (các yêu cầu HTTP GET đơn giản vì tôi đang nhắm mục tiêu một máy chủ web). Hệ thống này làm tăng các sự kiện khi máy chủ được phát hiện là "không hoạt động" (không thể truy cập được bằng HTTP) hoặc "up" (có thể truy cập lại). Trong trường hợp chung, bạn có thể xác định "đáng tin cậy" có nghĩa là gì trong trường hợp của mình và triển khai một logic tương tự.
Simon Mourier

9

Microsoft windows vista và 7 sử dụng kỹ thuật NCSI (Chỉ báo trạng thái kết nối mạng):

  1. NCSI thực hiện tra cứu DNS trên www.msftncsi.com, sau đó yêu cầu http://www.msftncsi.com/ncsi.txt . Tệp này là tệp văn bản thuần túy và chỉ chứa văn bản ' Microsoft NCSI '.
  2. NCSI gửi yêu cầu tra cứu DNS cho dns.msftncsi.com. Địa chỉ DNS này phải chuyển thành 131.107.255.255. Nếu địa chỉ không khớp, thì có nghĩa là kết nối internet không hoạt động chính xác.

3
Điều này thật tuyệt, nhưng không phải về mặt kỹ thuật về tính khả dụng của 'mạng' mà hơn thế nữa là 'tôi có kết nối internet qua http không?' Bạn có thể có kết nối mạng hoàn hảo nhưng không có kết nối internet, chẳng hạn như trên một mạng lan độc lập. Xem để biết thêm thông tin om NCSI: technet.microsoft.com/en-us/library/cc766017.aspx
MichielB

1

Gọi phương thức này để kiểm tra Kết nối mạng.

public static bool IsConnectedToInternet()
        {
            bool returnValue = false;
            try
            {

                int Desc;
                returnValue = Utility.InternetGetConnectedState(out Desc, 0);
            }
            catch
            {
                returnValue = false;
            }
            return returnValue;
        }

Đặt dòng mã này bên dưới.

[DllImport("wininet.dll")]
        public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.