Bagaimana cara memeriksa koneksi jaringan?


Jawaban:


153

Anda dapat memeriksa koneksi jaringan di .NET 2.0 menggunakan GetIsNetworkAvailable():

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

Untuk memantau perubahan alamat IP atau perubahan ketersediaan jaringan menggunakan peristiwa dari kelas NetworkChange :

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

9
Apakah ini menangani "ketersediaan terbatas"?
tofutim

Ini tidak selalu berfungsi di WPF. Beberapa laptop kembali palsu dan beberapa kembali benar
krilovich

Apakah ini benar-benar berhasil? Saya baru saja menulis baris ini dan mematikan router saya dan masih mengembalikan true!
Mushfiq

1
NetworkInterface.GetIsNetworkAvailable()sangat tidak dapat diandalkan di aplikasi saya (.NET 4.5, Windows 10), terutama saat dijalankan di mesin virtual. Penanganan acara dari NetworkAvailabilityChangedtelah dapat diandalkan.
eskimwier

Itu tidak bisa diandalkan. baca stackoverflow.com/a/25779403/2377343
T.Todua

174

Jawaban yang ditandai adalah 100% baik-baik saja, namun, ada kasus tertentu ketika metode standar tertipu oleh kartu virtual (kotak virtual, ...). Seringkali juga diinginkan untuk membuang beberapa antarmuka jaringan berdasarkan kecepatannya (port serial, modem, ...).

Berikut adalah potongan kode yang memeriksa kasus-kasus ini:

    /// <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
ini benar dan membutuhkan banyak suara positif - Saya menemukan bahwa acara NetworkAvailabilityChanged yang disebutkan dalam jawaban yang diterima tidak diaktifkan secara andal, yang mungkin disebabkan oleh adaptor virtual seperti yang disebutkan dalam jawaban ini
Marek

1
1 untuk pemeriksaan tambahan untuk mesin virtual. Baru saja mengalami kasus ini kemarin. Tapi saya masih berpikir ini tidak menangani 'Hype-V', karena mereka tidak memiliki 'virtual' dalam nama mereka.
Herdo

3
@Herdo - ya, kode tidak sempurna, dan saya tidak berpikir ada bisa menjadi apa pun yang sempurna di dunia maya. Tapi Anda bisa memperbaikinya.
Simon Mourier

@SimonMourier Anda benar. Hanya ingin mencatat bahwa, jika ada yang masih membalas true, jika tidak ada koneksi -> Ini mungkin menjadi masalah :)
Herdo

1
@noelicus - Pada proyek yang telah saya kerjakan sejauh ini, saya telah menerapkan sistem pemantauan / polling berkala (permintaan HTTP GET sederhana karena saya menargetkan server web) yang memunculkan peristiwa ketika server terdeteksi sebagai "down" (tidak dapat dijangkau dengan HTTP) atau "naik" (dapat dijangkau lagi). Dalam kasus umum, Anda dapat menentukan apa artinya "dapat diandalkan" dalam kasus Anda, dan menerapkan logika yang serupa.
Simon Mourier

9

Microsoft windows vista dan 7 menggunakan teknik NCSI (Network Connectivity Status Indicator):

  1. NCSI melakukan pencarian DNS di www.msftncsi.com, lalu meminta http://www.msftncsi.com/ncsi.txt . File ini adalah file teks biasa dan hanya berisi teks ' Microsoft NCSI '.
  2. NCSI mengirimkan permintaan pencarian DNS untuk dns.msftncsi.com. Alamat DNS ini harus menyelesaikan 131.107.255.255. Jika alamatnya tidak sesuai, maka diasumsikan koneksi internet tidak berfungsi dengan benar.

3
Ini bagus, tetapi secara teknis bukan tentang ketersediaan 'jaringan' tetapi lebih pada 'apakah saya memiliki konektivitas internet melalui http?' Anda dapat memiliki koneksi jaringan yang sempurna tetapi tidak ada konektivitas ke internet, misalnya pada LAN yang berdiri sendiri. Lihat untuk info lebih lanjut om NCSI: technet.microsoft.com/en-us/library/cc766017.aspx
MichielB

1

Panggil metode ini untuk memeriksa koneksi jaringan.

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

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

Letakkan ini di bawah baris kode.

[DllImport("wininet.dll")]
        public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.