Apa cara tercepat dan paling efisien untuk memeriksa konektivitas Internet di .NET?
c#
.net
internet-connection
Mohit Deshpande
sumber
sumber
Windows NLM API
harus menjadi yang terbaik untuk ini. stackoverflow.com/questions/5405895/…Jawaban:
Sesuatu seperti ini seharusnya bekerja.
System.Net.WebClient
sumber
I cannot image a world where www.google.com does not return some HTML
di Tiongkok misalnya ...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.
sumber
8.8.8.8
atau8.8.4.4
) berfungsi dengan baik untuk saya.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 internetAlih-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:
Jika jaringan tidak aktif, tindakan Anda akan gagal secepat ping, dll.
sumber
NetworkInterface.GetIsNetworkAvailable
sangat tidak bisa diandalkan. Hanya memiliki beberapa VMware atau koneksi LAN lainnya dan itu akan mengembalikan hasil yang salah. Juga tentangDns.GetHostEntry
metode saya hanya khawatir tentang apakah URL pengujian mungkin diblokir di lingkungan tempat aplikasi saya akan digunakan.Jadi cara lain yang saya temukan adalah menggunakan
InternetGetConnectedState
metode. Kode saya adalahsumber
Tes untuk koneksi internet dengan melakukan ping ke Google:
sumber
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:
sumber
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")]
danSystem.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
Atau variasi lain dariNetworkInterface
kelas tidak berfungsi dengan baik dalam mendeteksi ketersediaan jaringan. Metode ini hanya memeriksa apakah kabel jaringan dicolokkan atau tidak."Opsi Ping"
if
(Koneksi tersedia) kembalitrue
if
(Koneksi tidak tersedia dan kabel jaringan terhubung) kembalifalse
if
(Kabel jaringan tidak dicolokkan)Throws an exception
NetworkInterface
if
(Internet Tersedia) PengembalianTrue
if
(Internet tidak tersedia dan Kabel Jaringan Dicolokkan) KembaliTrue
if
(Kabel Jaringan Tidak Dicolokkan) kembalifalse
The [DllImport ("Wininet.dll" ")]
if
(Internet Tersedia) PengembalianTrue
if
(Internet tidak tersedia dan Kabel Jaringan Dicolokkan) KembaliTrue
if
(Kabel Jaringan Tidak Dicolokkan) kembalifalse
Jadi dalam kasus
[DllImport("Wininet.dll")]
danNetworkInterface
Tidak ada cara untuk mengetahui apakah koneksi internet tersedia.sumber
Tidak memecahkan masalah jaringan antara memeriksa dan menjalankan kode Anda tetapi cukup dapat diandalkan
sumber
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.
sumber
Inilah cara penerapannya di Android.
Sebagai bukti konsep, saya menerjemahkan kode ini ke C #:
sumber
sumber
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:
Pastikan untuk menambahkan referensi ke Network List 1.0 Type Library dari tab COM ... yang akan ditampilkan sebagai NETWORKLIST.
sumber
Cobalah untuk menghindari menguji koneksi dengan menangkap pengecualian. karena kami benar-benar Berharap bahwa kadang-kadang kami dapat kehilangan koneksi jaringan.
sumber
Jika Anda ingin memberi tahu pengguna / mengambil tindakan setiap kali terjadi perubahan jaringan / koneksi.
Gunakan API NLM:
https://msdn.microsoft.com/en-us/library/ee264321.aspx
http://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of
sumber
Saya pribadi menemukan jawaban Anton dan moffeltje terbaik, tetapi saya menambahkan cek untuk mengecualikan jaringan virtual yang dibuat oleh VMWare dan yang lainnya.
sumber
sumber
bb
masih benar bahkan ketika jaringan tidak terhubung ke internet.Versi ping multi-utas:
sumber
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?
Ini cukup sederhana, tetapi sangat membantu meningkatkan kualitas pemeriksaan, terutama ketika Anda ingin memeriksa berbagai konfigurasi proxy.
Begitu:
sumber
sumber
Gunakan NetworkMonitor untuk memantau keadaan jaringan dan koneksi internet.
Sampel:
sumber
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.
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.
Contoh berikut menggunakan metode GetIsNetworkAvailable untuk menentukan apakah koneksi jaringan tersedia.
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.
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.
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 ......!
sumber
Untuk aplikasi saya, kami juga menguji dengan mengunduh file kecil.
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.
sumber
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!
sumber
Saya memiliki tiga tes untuk koneksi Internet.
System.Net
danSystem.Net.Sockets
Tes 1
Tes 2
Tes 3
Melakukan tes
Jika Anda membuat
Dictionary
dariString
danBoolean
disebutCheckList
, Anda dapat menambahkan hasil dari setiap tes untukCheckList
.Sekarang, ulangi setiap
KeyValuePair
menggunakanfor...each
loop.Jika
CheckList
mengandungValue
daritrue
, maka Anda tahu ada koneksi internet.sumber
Itu bekerja
sumber