Apa cara terbaik untuk memeriksa konektivitas Internet menggunakan .NET?

237

Apa cara tercepat dan paling efisien untuk memeriksa konektivitas Internet di .NET?

Mohit Deshpande
sumber
6
Jika pengguna memiliki koneksi internet. Jika pengguna dapat terhubung ke internet. Untuk mengirim log email.
Mohit Deshpande
11
Kirimkan saja emailnya. Jika pengguna tidak terhubung, Anda kemungkinan akan menerima semacam pengecualian (yang mungkin harus Anda tangani sendiri).
Seth
15
Juga, perhatikan bahwa tidak ada cara untuk memeriksa apakah pengguna yang terhubung ke internet; yang bisa Anda katakan adalah jika mereka terhubung di masa lalu . Misalkan Anda memiliki metode: "bool c = IsConnected (); if (c) {DoSomething ();}" - antara panggilan ke IsConnected dan DoSomething, router jaringan nirkabel mungkin telah dicabut. IsConnected benar-benar harus dipanggil WasRecentlyConnected.
Eric Lippert
Windows NLM APIharus menjadi yang terbaik untuk ini. stackoverflow.com/questions/5405895/…
Mahbubur Rahman

Jawaban:

292

Sesuatu seperti ini seharusnya bekerja.

System.Net.WebClient

public static bool CheckForInternetConnection()
{
    try
    {
        using (var client = new WebClient())
            using (client.OpenRead("http://google.com/generate_204")) 
                return true; 
    }
    catch
    {
        return false;
    }
}
Kekacauan Kekacauan
sumber
18
Ini mungkin lebih baik daripada ping Google, karena saya pikir kami tidak memiliki jaminan bahwa Google terus menanggapi ping. Di sisi lain, saya tidak dapat membayangkan dunia di mana www.google.com tidak mengembalikan HTML :)
Daniel Vassallo
3
@Aniel: benar di satu sisi, tetapi di sisi lain, sebenarnya mengunduh situs web itu sedikit overhead imo
Leo
9
Either way, tidak ada alasan untuk menarik kembali 4KB - cukup gunakan client.OpenRead (url) sebagai gantinya. Jika tidak ada pengecualian maka itu bisa terhubung.
Josh M.
14
Itu sebenarnya tidak begitu efisien. Menggunakan itu membuat program saya mulai lebih dari 1 menit jika tidak ada internet. Mungkin karena mencoba menyelesaikan DNS. Pinging 8.8.8.8 (google dns) mengubahnya menjadi 3 detik.
MadBoy
8
@DanielVassallo I cannot image a world where www.google.com does not return some HTMLdi Tiongkok misalnya ...
Jérôme MEVEL
84

Sama sekali tidak ada cara Anda dapat dengan andal memeriksa apakah ada koneksi internet atau tidak (saya berasumsi maksud Anda adalah akses ke internet).

Namun, Anda dapat meminta sumber daya yang hampir tidak pernah luring, seperti melakukan ping google.com atau yang serupa. Saya pikir ini akan efisien.

try { 
    Ping myPing = new Ping();
    String host = "google.com";
    byte[] buffer = new byte[32];
    int timeout = 1000;
    PingOptions pingOptions = new PingOptions();
    PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
    return (reply.Status == IPStatus.Success);
}
catch (Exception) {
    return false;
}
Leo
sumber
24
+1 "Sama sekali tidak ada cara Anda dapat dengan andal memeriksa apakah ada koneksi internet"
woz
6
Semua ini dilakukan adalah memeriksa apakah Google sudah aktif ketika Anda melakukan ping. Jika instan berikutnya setelah ping sukses Anda internet turun lalu apa? Tidak ada gunanya memeriksa sebelum melakukan.
dbasnett
12
Dan bagaimana hal ini bertentangan dengan pernyataan utama jawaban saya?
Leo
10
Menggunakan "google.com" akan membutuhkan lebih banyak waktu karena harus diselesaikan. Sebaliknya, melakukan ping secara langsung menggunakan IP akan lebih cepat. Ping ke alamat IP DNS Publik Google ( 8.8.8.8atau 8.8.4.4) berfungsi dengan baik untuk saya.
Mangesh
8
Saya ingin menegaskan kembali bahwa Beware - many schools and offices block the ping protocol.jika Anda menggunakan metode ini untuk aplikasi yang akan digunakan oleh klien, saya akan menyarankan agar metode ini tidak memeriksa internet
user1
42

Alih-alih memeriksa, lakukan saja tindakan (permintaan web, mail, ftp, dll.) Dan bersiaplah untuk permintaan gagal, yang harus Anda lakukan pula, bahkan jika cek Anda berhasil.

Pertimbangkan yang berikut ini:

1 - check, and it is OK
2 - start to perform action 
3 - network goes down
4 - action fails
5 - lot of good your check did

Jika jaringan tidak aktif, tindakan Anda akan gagal secepat ping, dll.

1 - start to perform action
2 - if the net is down(or goes down) the action will fail
dbasnett
sumber
9
Baik! Lakukan saja - tetapi bersiaplah untuk semua hasil.
Kolonel Panic
3
Pertimbangkan yang berikut ini: Anda perlu Melakukan Sesuatu jika jaringan mati selama x waktu (mis. Tracelog, router reset)
Abir
2
Bukan OP, tetapi alasan saya ingin melakukan ini adalah untuk MENGHINDARI TIMEOUT KEDUA 100 DEFAULT jika konektivitas Internet tidak tersedia. Permintaan HTTP dilakukan pada utas latar belakang, jadi utas UI tidak diblokir, tetapi aplikasi saya tidak dapat keluar sampai utas latar belakang kembali dari permintaan HTTP dan berakhir. Daripada mencoba mencari nilai batas waktu "happy medium", saya ingin menghindari permintaan sama sekali jika saya tahu koneksi internet sedang down.
Scott Smith
2
Maksud saya adalah bahwa kita tidak dapat menjelaskan kapan layanan jarak jauh mungkin tersedia / tidak tersedia. Juga, bagaimana dengan situs yang tidak menanggapi ping?
dbasnett
Kasus penggunaan lain adalah pemeriksa online yang akan mengingatkan saya segera setelah internet saya kembali
Ben Philipp
28

NetworkInterface.GetIsNetworkAvailablesangat tidak bisa diandalkan. Hanya memiliki beberapa VMware atau koneksi LAN lainnya dan itu akan mengembalikan hasil yang salah. Juga tentang Dns.GetHostEntrymetode saya hanya khawatir tentang apakah URL pengujian mungkin diblokir di lingkungan tempat aplikasi saya akan digunakan.

Jadi cara lain yang saya temukan adalah menggunakan InternetGetConnectedStatemetode. Kode saya adalah

[System.Runtime.InteropServices.DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int Description, int ReservedValue);

public static bool CheckNet()
{
     int desc;
     return InternetGetConnectedState(out desc, 0);         
}
Kamran Shahid
sumber
Selama pengujian, saya menemukan bahwa InternetGetConnectedState kembali benar ketika pemain VMWare diinstal (internet terputus). Harus menonaktifkannya di Control Panel \ Network dan Internet \ Network Connections (VMNet1 dan VMNet8).
Hoki
Ok Justin Oringer. Meskipun saya sudah memeriksanya tetapi harus memverifikasi lagi
Kamran Shahid
2
Pendekatan terbaik untuk saya, saya masih memeriksa konektivitas layanan saya setelah itu, kemudian memulai rutinitas ... Saya hanya ingin menghindari pengecualian.
Wagner Bertolini Junior
4
Kode ini hanya memeriksa apakah kabel jaringan terhubung.
HackerMan
14

Tes untuk koneksi internet dengan melakukan ping ke Google:

new Ping().Send("www.google.com.mx").Status == IPStatus.Success
Jaime Macias
sumber
7
Deskripsi yang cocok dengan jawaban ini akan bermanfaat bagi lebih banyak orang daripada hanya penulis asli pertanyaan.
Boeckm
13
Waspadalah - banyak sekolah dan kantor memblokir protokol ping. Konyol, saya tahu.
Kolonel Panic
Saya tidak dapat menemukan kelas ping. Bisakah bantu saya. Saya bekerja di UWP dan cara lain melalui informasi jaringan tidak berfungsi
iam.Carrot
12

Saya tidak setuju dengan orang-orang yang menyatakan: "Apa gunanya memeriksa konektivitas sebelum melakukan tugas, segera setelah pemeriksaan koneksi mungkin hilang". Tentunya ada tingkat ketidakpastian dalam banyak tugas pemrograman yang kami selaku pengembang lakukan, tetapi mengurangi ketidakpastian ke tingkat penerimaan adalah bagian dari tantangan.

Saya baru-baru ini mengalami masalah membuat aplikasi yang termasuk fitur pemetaan yang ditautkan ke server ubin online. Fungsi ini harus dinonaktifkan di mana kurangnya konektivitas internet dicatat.

Beberapa respons pada halaman ini sangat baik, tetapi bagaimanapun menyebabkan banyak masalah kinerja seperti menggantung, terutama dalam kasus tidak adanya konektivitas.

Inilah solusi yang akhirnya saya gunakan, dengan bantuan beberapa jawaban ini dan kolega saya:

         // Insert this where check is required, in my case program start
         ThreadPool.QueueUserWorkItem(CheckInternetConnectivity);
    }

    void CheckInternetConnectivity(object state)
    {
        if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
        {
            using (WebClient webClient = new WebClient())
            {
                webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
                webClient.Proxy = null;
                webClient.OpenReadCompleted += webClient_OpenReadCompleted;
                webClient.OpenReadAsync(new Uri("<url of choice here>"));
            }
        }
    }

    volatile bool internetAvailable = false; // boolean used elsewhere in code

    void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            internetAvailable = true;
            Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
            {
                // UI changes made here
            }));
        }
    }
PJRobot
sumber
11

Saya telah melihat semua opsi yang tercantum di atas dan satu-satunya pilihan untuk memeriksa apakah internet tersedia atau tidak adalah opsi "Ping". Mengimpor [DllImport("Wininet.dll")]dan System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() Atau variasi lain dari NetworkInterface kelas tidak berfungsi dengan baik dalam mendeteksi ketersediaan jaringan. Metode ini hanya memeriksa apakah kabel jaringan dicolokkan atau tidak.

"Opsi Ping"

if(Koneksi tersedia) kembali true

if(Koneksi tidak tersedia dan kabel jaringan terhubung) kembali false

if(Kabel jaringan tidak dicolokkan) Throws an exception

NetworkInterface

if(Internet Tersedia) Pengembalian True

if(Internet tidak tersedia dan Kabel Jaringan Dicolokkan) Kembali True

if(Kabel Jaringan Tidak Dicolokkan) kembali false

The [DllImport ("Wininet.dll" ")]

if(Internet Tersedia) Pengembalian True

if(Internet tidak tersedia dan Kabel Jaringan Dicolokkan) Kembali True

if(Kabel Jaringan Tidak Dicolokkan) kembali false

Jadi dalam kasus [DllImport("Wininet.dll")] dan NetworkInterface Tidak ada cara untuk mengetahui apakah koneksi internet tersedia.

HackerMan
sumber
Ini tidak benar, saya mengimpor Wininet.dll, memasang kabel jaringan dan mendapatkan hasil yang benar untuk skenario internet tidak tersedia.
Waldemar Gałęzinowski
8

Tidak memecahkan masalah jaringan antara memeriksa dan menjalankan kode Anda tetapi cukup dapat diandalkan

public static bool IsAvailableNetworkActive()
{
    // only recognizes changes related to Internet adapters
    if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
    {
        // however, this will include all adapters -- filter by opstatus and activity
        NetworkInterface[] interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
        return (from face in interfaces
                where face.OperationalStatus == OperationalStatus.Up
                where (face.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && (face.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                select face.GetIPv4Statistics()).Any(statistics => (statistics.BytesReceived > 0) && (statistics.BytesSent > 0));
    }

    return false;
}
Anton
sumber
Ide bagus, tetapi seperti yang Anda katakan mungkin tidak sempurna. Anda dapat men-cache byte yang dikirim / diterima juga untuk pemeriksaan selanjutnya. Masih belum sempurna.
Todd
Kode ini tidak berfungsi, Harap perbaiki. Ini hanya memeriksa apakah kabel jaringan dicolokkan atau tidak.
HackerMan
5

Pinging google.com memperkenalkan ketergantungan resolusi DNS. Ping 8.8.8.8 baik-baik saja tetapi Google berjarak beberapa lompatan dari saya. Yang perlu saya lakukan hanyalah melakukan ping ke hal terdekat yang ada di internet.

Saya dapat menggunakan fitur TTL Ping untuk ping hop # 1, lalu hop # 2, dll, hingga saya mendapatkan balasan dari sesuatu yang ada di alamat yang bisa dirutekan; jika simpul itu ada pada alamat yang bisa dirutekan maka simpul itu ada di internet. Bagi kebanyakan dari kita, hop # 1 akan menjadi gateway / router lokal kita, dan hop # 2 akan menjadi titik pertama di sisi lain dari koneksi fiber kita atau apa pun.

Kode ini berfungsi untuk saya, dan merespons lebih cepat daripada beberapa saran lain di utas ini karena melakukan ping apa pun yang terdekat dengan saya di internet.

using System.Net;
using System.Net.Sockets;
using System.Net.NetworkInformation;
using System.Diagnostics;

internal static bool ConnectedToInternet()
{
    const int maxHops = 30;
    const string someFarAwayIpAddress = "8.8.8.8";

    // Keep pinging further along the line from here to google 
    // until we find a response that is from a routable address
    for (int ttl = 1; ttl <= maxHops; ttl++)
    {
        Ping pinger = new Ping();
        PingOptions options = new PingOptions(ttl, true);
        byte[] buffer = new byte[32];
        PingReply reply = null;
        try
        {
            reply = pinger.Send(someFarAwayIpAddress, 10000, buffer, options);
        }
        catch (System.Net.NetworkInformation.PingException pingex)
        {
            Debug.Print("Ping exception (probably due to no network connection or recent change in network conditions), hence not connected to internet. Message: " + pingex.Message);
            return false;
        }

        System.Diagnostics.Debug.Print("Hop #" + ttl.ToString() + " is " + (reply.Address == null ? "null" : reply.Address.ToString()) + ", " + reply.Status.ToString());

        if (reply.Status != IPStatus.TtlExpired && reply.Status != IPStatus.Success)
        {
            Debug.Print("Hop #" + ttl.ToString() + " is " + reply.Status.ToString() + ", hence we are not connected.");
            return false;
        }

        if (IsRoutableAddress(reply.Address))
        {
            System.Diagnostics.Debug.Print("That's routable so you must be connected to the internet.");
            return true;
        }
    }

    return false;
}

private static bool IsRoutableAddress(IPAddress addr)
{
    if (addr == null)
    {
        return false;
    }
    else if (addr.AddressFamily == AddressFamily.InterNetworkV6)
    {
        return !addr.IsIPv6LinkLocal && !addr.IsIPv6SiteLocal;
    }
    else // IPv4
    {
        byte[] bytes = addr.GetAddressBytes();
        if (bytes[0] == 10)
        {   // Class A network
            return false;
        }
        else if (bytes[0] == 172 && bytes[1] >= 16 && bytes[1] <= 31)
        {   // Class B network
            return false;
        }
        else if (bytes[0] == 192 && bytes[1] == 168)
        {   // Class C network
            return false;
        }
        else
        {   // None of the above, so must be routable
            return true;
        }
    }
}
Jinlye
sumber
4

Inilah cara penerapannya di Android.

Sebagai bukti konsep, saya menerjemahkan kode ini ke C #:

var request = (HttpWebRequest)WebRequest.Create("http://g.cn/generate_204");
request.UserAgent = "Android";
request.KeepAlive = false;
request.Timeout = 1500;

using (var response = (HttpWebResponse)request.GetResponse())
{
    if (response.ContentLength == 0 && response.StatusCode == HttpStatusCode.NoContent)
    {
        //Connection to internet available
    }
    else
    {
        //Connection to internet not available
    }
}
semilir
sumber
3
private bool ping()
{
    System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
    System.Net.NetworkInformation.PingReply reply = pingSender.Send(address);
    if (reply.Status == System.Net.NetworkInformation.IPStatus.Success)
    {                
        return true;
    }
    else
    {                
        return false;
    }
}
Shai Segev
sumber
2

Opsi lain adalah Network List Manager API yang tersedia untuk Vista dan Windows 7. Artikel MSDN di sini . Dalam artikel tersebut ada tautan untuk mengunduh contoh kode yang memungkinkan Anda melakukan ini:

AppNetworkListUser nlmUser = new AppNetworkListUser();
Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString());

Pastikan untuk menambahkan referensi ke Network List 1.0 Type Library dari tab COM ... yang akan ditampilkan sebagai NETWORKLIST.

Gierow
sumber
7
eeeeww. Menggunakan COM hell di .NET?
jgauffin
@ jgauffin Bisakah Anda menjelaskan mengapa orang harus menghindari COM di .NET? Dibandingkan dengan solusi lain yang saya temukan, solusi COM tampaknya bekerja dengan cukup baik.
inexcitus
2

Cobalah untuk menghindari menguji koneksi dengan menangkap pengecualian. karena kami benar-benar Berharap bahwa kadang-kadang kami dapat kehilangan koneksi jaringan.

 if (NetworkInterface.GetIsNetworkAvailable() &&
     new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
 //is online
 else
 //is offline
Shervin Ivari
sumber
1
Dari mana NetworkInterface berasal? EDIT: Saya menemukannya: System.Net.NetworkInformation
inspire_coding
1

Saya pribadi menemukan jawaban Anton dan moffeltje terbaik, tetapi saya menambahkan cek untuk mengecualikan jaringan virtual yang dibuat oleh VMWare dan yang lainnya.

public static bool IsAvailableNetworkActive()
{
    // only recognizes changes related to Internet adapters
    if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) return false;

    // however, this will include all adapters -- filter by opstatus and activity
    NetworkInterface[] interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
    return (from face in interfaces
            where face.OperationalStatus == OperationalStatus.Up
            where (face.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && (face.NetworkInterfaceType != NetworkInterfaceType.Loopback)
            where (!(face.Name.ToLower().Contains("virtual") || face.Description.ToLower().Contains("virtual")))
            select face.GetIPv4Statistics()).Any(statistics => (statistics.BytesReceived > 0) && (statistics.BytesSent > 0));
}
Spegeli
sumber
FYI dari dokumen GetIsNetworkAvailable (): Koneksi jaringan dianggap tersedia jika antarmuka jaringan ditandai "naik" dan bukan antarmuka loopback atau terowongan. Saya tidak tahu apakah virtual akan selalu atas nama atau deskripsi inteface. Apakah itu standar?
Mike Cheel
1
bool bb = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

if (bb == true)
    MessageBox.Show("Internet connections are available");
else
    MessageBox.Show("Internet connections are not available");
Hari Prasath
sumber
1
Bisakah Anda menambahkan informasi yang berkaitan dengan kecepatan ini dan bagaimana ini lebih baik daripada solusi lain yang diposting. Ini akan membantu jawaban Anda dalam sepenuhnya menjawab pertanyaan.
Ren
8
Masalah dengan opsi ini adalah itu bbmasih benar bahkan ketika jaringan tidak terhubung ke internet.
halfpastfour.am
2
Meskipun benar bahwa ini tidak langsung menjawab pertanyaan, saya pikir masih bermanfaat untuk menggunakan GetIsNetworkAvailable sebagai pemeriksaan awal sebelum mencoba melakukan ping ke Google dll.
Ben Hughes
3
Kode ini tidak memberi tahu apakah Koneksi Internet Tersedia atau tidak. Jika Anda mencolokkan kabel jaringan tanpa internet, itu akan kembali benar.
HackerMan
1

Versi ping multi-utas:

  using System;
  using System.Collections.Generic;
  using System.Diagnostics;
  using System.Net.NetworkInformation;
  using System.Threading;


  namespace OnlineCheck
  {
      class Program
      {

          static bool isOnline = false;

          static void Main(string[] args)
          {
              List<string> ipList = new List<string> {
                  "1.1.1.1", // Bad ip
                  "2.2.2.2",
                  "4.2.2.2",
                  "8.8.8.8",
                  "9.9.9.9",
                  "208.67.222.222",
                  "139.130.4.5"
                  };

              int timeOut = 1000 * 5; // Seconds


              List<Thread> threadList = new List<Thread>();

              foreach (string ip in ipList)
              {

                  Thread threadTest = new Thread(() => IsOnline(ip));
                  threadList.Add(threadTest);
                  threadTest.Start();
              }

              Stopwatch stopwatch = Stopwatch.StartNew();

              while (!isOnline && stopwatch.ElapsedMilliseconds <= timeOut)
              {
                   Thread.Sleep(10); // Cooldown the CPU
              }

              foreach (Thread thread in threadList)
              { 
                  thread.Abort(); // We love threads, don't we?
              }


              Console.WriteLine("Am I online: " + isOnline.ToYesNo());
              Console.ReadKey();
          }

          static bool Ping(string host, int timeout = 3000, int buffer = 32)
          {
              bool result = false;

              try
              {
                  Ping ping = new Ping();                
                  byte[] byteBuffer = new byte[buffer];                
                  PingOptions options = new PingOptions();
                  PingReply reply = ping.Send(host, timeout, byteBuffer, options);
                  result = (reply.Status == IPStatus.Success);
              }
              catch (Exception ex)
              {

              }

              return result;
          }

          static void IsOnline(string host)
          {
              isOnline =  Ping(host) || isOnline;
          }
      }

      public static class BooleanExtensions
      {
          public static string ToYesNo(this bool value)
          {
              return value ? "Yes" : "No";
          }
      }
  }
Nime Cloud
sumber
0

Saya tidak akan berpikir itu tidak mungkin, hanya saja tidak langsung.

Saya telah membangun sesuatu seperti ini, dan ya itu tidak sempurna, tetapi langkah pertama sangat penting: untuk memeriksa apakah ada konektivitas jaringan. Windows Api tidak melakukan pekerjaan dengan baik, jadi mengapa tidak melakukan pekerjaan yang lebih baik?

bool NetworkIsAvailable()
{
    var all = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces();
    foreach (var item in all)
    {
        if (item.NetworkInterfaceType == NetworkInterfaceType.Loopback)
            continue;
        if (item.Name.ToLower().Contains("virtual") || item.Description.ToLower().Contains("virtual"))
            continue; //Exclude virtual networks set up by VMWare and others
        if (item.OperationalStatus == OperationalStatus.Up)
        {
            return true;
        }
    }

    return false;
}

Ini cukup sederhana, tetapi sangat membantu meningkatkan kualitas pemeriksaan, terutama ketika Anda ingin memeriksa berbagai konfigurasi proxy.

Begitu:

  • Periksa apakah ada konektivitas jaringan (buat ini benar-benar bagus, bahkan mungkin ada log yang dikirim kembali ke pengembang ketika ada positif palsu untuk meningkatkan fungsi NetworkIsAvailable)
  • Ping HTTP
  • (Ulangi konfigurasi Proxy dengan HTTP Ping di masing-masing)
Todd
sumber
1
@hackerman ini adalah langkah pertama yang tidak jelas. Coder dapat melakukan ping cepat ke server mereka sendiri jika itu mengembalikan true, sebagai langkah kedua. Yang penting, ini memberikan alternatif untuk metode windows api cacat. Sisanya adalah detail.
Todd
3
Memalsukan. Jika tidak ada antarmuka jaringan, pasti tidak ada internet. Uui dapat diperbarui segera tanpa penundaan, tidak ada pemeriksaan lebih lanjut pada host lain.
Todd
0
public static bool Isconnected = false;

public static bool CheckForInternetConnection()
{
    try
    {
        Ping myPing = new Ping();
        String host = "google.com";
        byte[] buffer = new byte[32];
        int timeout = 1000;
        PingOptions pingOptions = new PingOptions();
        PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
        if (reply.Status == IPStatus.Success)
        {
            return true;
        }
        else if (reply.Status == IPStatus.TimedOut)
        {
            return Isconnected;
        }
        else
        {
            return false;
        }
    }
    catch (Exception)
    {
        return false;
    }
}

public static void CheckConnection()
{
    if (CheckForInternetConnection())
    {
        Isconnected = true;
    }
    else
    {
        Isconnected = false;
    }
}
Salih Alija
sumber
Silakan komentar jawaban Anda. Jawaban hanya dengan kode tidak diizinkan.
ganchito55
Cukup jelas, menjaga demi kepolisian?
menggulung
0

Gunakan NetworkMonitor untuk memantau keadaan jaringan dan koneksi internet.

Sampel:

namespace AmRoNetworkMonitor.Demo
{
    using System;

    internal class Program
    {
        private static void Main()
        {
            NetworkMonitor.StateChanged += NetworkMonitor_StateChanged;
            NetworkMonitor.StartMonitor();

            Console.WriteLine("Press any key to stop monitoring.");
            Console.ReadKey();
            NetworkMonitor.StopMonitor();

            Console.WriteLine("Press any key to close program.");
            Console.ReadKey();
        }

        private static void NetworkMonitor_StateChanged(object sender, StateChangeEventArgs e)
        {
            Console.WriteLine(e.IsAvailable ? "Is Available" : "Is Not Available");
        }
    }
}

sumber
Ide bagus, tetapi memeriksa ketersediaan jaringan, bukan ketersediaan internet
John Demetriou
Kelas ini juga memeriksa ketersediaan Internet: SourceCode
masalahnya adalah, saya mencobanya, tetapi hanya menyala jika tidak ada jaringan yang tersedia
John Demetriou
0

pengantar

Dalam beberapa skenario Anda perlu memeriksa apakah internet tersedia atau tidak menggunakan kode C # di aplikasi windows. Mungkin untuk mengunduh atau mengunggah file menggunakan internet dalam bentuk windows atau untuk mendapatkan beberapa data dari database yang berada di lokasi terpencil, dalam situasi ini pemeriksaan internet adalah wajib.

Ada beberapa cara untuk memeriksa ketersediaan internet menggunakan C # dari kode di belakang. Semua cara tersebut dijelaskan di sini termasuk batasannya.

  1. InternetGetConnectedState (wininet)

API 'wininet' dapat digunakan untuk memeriksa apakah sistem lokal memiliki koneksi internet aktif atau tidak. Namespace yang digunakan untuk ini adalah 'System.Runtime.InteropServices' dan impor dll 'wininet.dll' menggunakan DllImport. Setelah ini buat variabel boolean dengan extern static dengan nama fungsi InternetGetConnectedState dengan dua parameter deskripsi dan reservedValue seperti yang ditunjukkan dalam contoh.

Catatan: Pengubah extern digunakan untuk mendeklarasikan metode yang diterapkan secara eksternal. Penggunaan umum pengubah extern adalah dengan atribut DllImport ketika Anda menggunakan layanan Interop untuk memanggil kode yang tidak dikelola. Dalam hal ini, metode ini juga harus dinyatakan sebagai statis.

Selanjutnya buat metode dengan nama 'IsInternetAvailable' sebagai boolean. Fungsi di atas akan digunakan dalam metode ini yang mengembalikan status internet sistem lokal

[DllImport("wininet.dll")]
private extern static bool InternetGetConnectedState(out int description, int reservedValue);
public static bool IsInternetAvailable()
{
    try
    {
        int description;
        return InternetGetConnectedState(out description, 0);
    }
    catch (Exception ex)
    {
        return false;
    }
}
  1. GetIsNetworkAvailable

Contoh berikut menggunakan metode GetIsNetworkAvailable untuk menentukan apakah koneksi jaringan tersedia.

if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
{
    System.Windows.MessageBox.Show("This computer is connected to the internet");
}
else
{
    System.Windows.MessageBox.Show("This computer is not connected to the internet");
}

Keterangan (Sesuai MSDN): Koneksi jaringan dianggap tersedia jika antarmuka jaringan ditandai "naik" dan bukan antarmuka loopback atau terowongan.

Ada banyak kasus di mana perangkat atau komputer tidak terhubung ke jaringan yang bermanfaat tetapi masih dianggap tersedia dan GetIsNetworkAvailable akan kembali benar. Misalnya, jika perangkat yang menjalankan aplikasi terhubung ke jaringan nirkabel yang memerlukan proxy, tetapi proxy tidak disetel, GetIsNetworkAvailable akan mengembalikan true. Contoh lain ketika GetIsNetworkAvailable akan kembali benar adalah jika aplikasi berjalan pada komputer yang terhubung ke hub atau router di mana hub atau router telah kehilangan koneksi hulu.

  1. Ping nama host di jaringan

Kelas Ping dan PingReply memungkinkan aplikasi untuk menentukan apakah komputer jarak jauh dapat diakses melalui jaringan dengan mendapatkan balasan dari tuan rumah. Kelas-kelas ini tersedia di namespace System.Net.NetworkInformation. Contoh berikut menunjukkan cara melakukan ping host.

protected bool CheckConnectivity(string ipAddress)
{
    bool connectionExists = false;
    try
    {
        System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping();
        System.Net.NetworkInformation.PingOptions options = new System.Net.NetworkInformation.PingOptions();
        options.DontFragment = true;
        if (!string.IsNullOrEmpty(ipAddress))
        {
            System.Net.NetworkInformation.PingReply reply = pingSender.Send(ipAddress);
            connectionExists = reply.Status == 
System.Net.NetworkInformation.IPStatus.Success ? true : false;
        }
    }
    catch (PingException ex)
    {
        Logger.LogException(ex.Message, ex);
    }
    return connectionExists;
}

Keterangan (Sesuai MSDN): Aplikasi menggunakan kelas Ping untuk mendeteksi apakah komputer jarak jauh dapat dijangkau. Topologi jaringan dapat menentukan apakah Ping berhasil menghubungi host jarak jauh. Kehadiran dan konfigurasi proksi, peralatan terjemahan alamat jaringan (NAT), atau firewall dapat mencegah Ping dari berhasil. Ping yang berhasil hanya menunjukkan bahwa host jarak jauh dapat dijangkau di jaringan; keberadaan layanan tingkat yang lebih tinggi (seperti server Web) pada host jarak jauh tidak dijamin.

Komentar / Saran diundang. Selamat coding ......!

Khuram Shahzad
sumber
-1

Untuk aplikasi saya, kami juga menguji dengan mengunduh file kecil.

string remoteUri = "https://www.microsoft.com/favicon.ico"

WebClient myWebClient = new WebClient();

try
{
    byte[] myDataBuffer = myWebClient.DownloadData (remoteUri);
    if(myDataBuffer.length > 0) // Or add more validate. eg. checksum
    {
        return true;
    }
}
catch
{
    return false;
}

Juga. Beberapa ISP dapat menggunakan server tengah untuk menyimpan file cache. Tambahkan parameter acak yang tidak digunakan misalnya. https://www.microsoft.com/favicon.ico?req=random_number Dapat mencegah caching.

pengguna282341
sumber
-1

Saya mengalami masalah pada metode tersebut pada Router / modem 3g saya, karena jika internet terputus router mengalihkan halaman ke halaman responnya, jadi Anda masih mendapatkan uap dan kode Anda berpikir ada internet. Apel (atau yang lain) memiliki halaman pemotongan hot spot yang selalu mengembalikan respons tertentu. Sampel berikut mengembalikan respons "Sukses". Jadi, Anda akan benar-benar yakin Anda bisa menghubungkan internet dan mendapatkan respons nyata!

public static bool CheckForInternetConnection()
{
    try
    {       
        using (var webClient = new WebClient())
        using (var stream = webClient.OpenRead("http://captive.apple.com/hotspot-detect.html"))
        {
            if (stream != null)
            {
                //return true;
                stream.ReadTimeout = 1000;
                using (var reader = new StreamReader(stream, Encoding.UTF8, false))
                {
                    string line;
                    while ((line = reader.ReadLine()) != null)
                    {
                        if (line == "<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>")
                        {
                            return true;
                        }
                        Console.WriteLine(line);
                    }
                }

            }
            return false;
        }
    }
    catch
    {

    }
    return false;
}
Yusuf GURDAG
sumber
-2

Saya memiliki tiga tes untuk koneksi Internet.

  • Referensi System.NetdanSystem.Net.Sockets
  • Tambahkan fungsi tes berikut:

Tes 1

public bool IsOnlineTest1()
{
    try
    {
        IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
        return true;
    }
    catch (SocketException ex)
    {
        return false;
    }
}

Tes 2

public bool IsOnlineTest2()
{
    try
    {
        IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
        return true;
    }
    catch (SocketException ex)
    {
        return false;
    }
}

Tes 3

public bool IsOnlineTest3()
{
    System.Net.WebRequest req = System.Net.WebRequest.Create("https://www.google.com");
    System.Net.WebResponse resp = default(System.Net.WebResponse);
    try
    {
        resp = req.GetResponse();
        resp.Close();
        req = null;
        return true;
    }
    catch (Exception ex)
    {
        req = null;
        return false;
    }
}

Melakukan tes

Jika Anda membuat Dictionarydari Stringdan Booleandisebut CheckList, Anda dapat menambahkan hasil dari setiap tes untuk CheckList.

Sekarang, ulangi setiap KeyValuePairmenggunakan for...eachloop.

Jika CheckListmengandung Valuedari true, maka Anda tahu ada koneksi internet.

M. Liviu
sumber
-4
public static bool HasConnection()
{
    try
    {
        System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
        return true;
    }
    catch
    {
        return false;
    }
}

Itu bekerja

slayerIQ
sumber
46
Jika Anda memiliki IP Google di cache DNS Anda, itu tidak akan mengirim permintaan DNS, jadi itu bisa kembali benar bahkan jika Anda tidak terhubung
Thomas Levesque