.NET'te Internet bağlantısını kontrol etmenin en hızlı ve en etkili yolu nedir?
Windows NLM API
bunun için en iyisi olmalı. stackoverflow.com/questions/5405895/…
.NET'te Internet bağlantısını kontrol etmenin en hızlı ve en etkili yolu nedir?
Windows NLM API
bunun için en iyisi olmalı. stackoverflow.com/questions/5405895/…
Yanıtlar:
Böyle bir şey işe yaramalı.
public static bool CheckForInternetConnection()
{
try
{
using (var client = new WebClient())
using (client.OpenRead("http://google.com/generate_204"))
return true;
}
catch
{
return false;
}
}
I cannot image a world where www.google.com does not return some HTML
, örneğin ...
Kesinlikle bir internet bağlantısı olup olmadığını güvenilir bir şekilde kontrol edebilirsiniz hiçbir yolu yoktur (ben internet erişimi demek varsayalım).
Bununla birlikte, google.com'a ping veya benzeri bir şey gibi neredeyse hiç çevrimdışı olmayan kaynaklar isteyebilirsiniz. Bunun verimli olacağını düşünüyorum.
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;
}
8.8.8.8
veya 8.8.4.4
) ping atmak benim için iyi çalışıyor.
Beware - many schools and offices block the ping protocol.
istemciler tarafından kullanılacak bir uygulama için bu yöntemi kullanıyorsanız, ben internet
Kontrol etmek yerine, eylemi gerçekleştirin (web isteği, posta, ftp vb.) Ve çekiniz başarılı olsa bile yine de yapmanız gereken isteğin başarısız olmasına hazırlıklı olun.
Aşağıdakileri göz önünde bulundur:
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
Ağ kapalıysa, eyleminiz ping vb. Kadar hızlı başarısız olur.
1 - start to perform action
2 - if the net is down(or goes down) the action will fail
NetworkInterface.GetIsNetworkAvailable
çok güvenilmez. Sadece bazı VMware veya başka bir LAN bağlantısı var ve yanlış sonuç döndürecektir. Ayrıca yaklaşık Dns.GetHostEntry
yöntemle sadece test URL'si benim uygulama dağıtmak için gidiyor ortamda bloke olasılığının olup olmadığı konusunda endişe vardı.
Bu yüzden öğrendiğim bir başka InternetGetConnectedState
yöntem de yöntem kullanmak . Kodum
[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);
}
Google'a ping komutu göndererek İnternet bağlantısı testi:
new Ping().Send("www.google.com.mx").Status == IPStatus.Success
Şunu söyleyenlere katılmıyorum: "Bir görevi gerçekleştirmeden önce bağlantıyı kontrol etmenin anlamı nedir, bağlantıdan hemen sonra bağlantı kaybedilebilir." Elbette, geliştiriciler olarak üstlendiğimiz birçok programlama görevinde bir dereceye kadar belirsizlik vardır, ancak belirsizliği bir kabul seviyesine indirmek zorluğun bir parçasıdır.
Son zamanlarda on-line döşeme sunucusuna bağlı bir eşleme özelliği de dahil olmak üzere bir uygulama yapma bu sorunla karşılaştı. İnternet bağlantısı eksikliğinin görüldüğü yerlerde bu işlev devre dışı bırakılacaktı.
Bu sayfadaki yanıtların bazıları çok iyiydi, ancak esas olarak bağlantının olmaması durumunda, askıda kalma gibi birçok performans sorununa neden oldu.
İşte bu cevapların ve meslektaşlarımın yardımıyla çözüm buldum:
// 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
}));
}
}
Yukarıda listelenen tüm seçenekleri gördüm ve internet kalmamak için tek geçerli seçenek kullanılabilir ya da değil "Ping" seçeneğidir. İçe aktarma [DllImport("Wininet.dll")]
veya System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
Veya NetworkInterface
sınıfın diğer herhangi bir varyasyonu , ağın kullanılabilirliğini saptamada iyi çalışmaz.Bu Yöntemler yalnızca ağ kablosunun takılı olup olmadığını kontrol eder.
"Ping seçeneği"
if
(Bağlantı mevcut) döner true
if
(Bağlantı mevcut değil ve ağ kablosu takılı) false
if
(Ağ kablosu takılı değil) Throws an exception
NetworkInterface
if
(İnternet kullanılabilir) İade True
if
(İnternet Kullanılamıyor ve Ağ Kablosu Takılı) True
if
(Ağ Kablosu Takılı Değil) geri döner false
[DllImport ("Wininet.dll")]
if
(İnternet kullanılabilir) İade True
if
(İnternet Kullanılamıyor ve Ağ Kablosu Takılı) True
if
(Ağ Kablosu Takılı Değil) geri döner false
Yani durumunda [DllImport("Wininet.dll")]
ve NetworkInterface
internet bağlantısının mevcut olup olmadığını bilmenin bir yolu yoktur.
Kodunuzu kontrol etme ve çalıştırma arasındaki ağ sorununu çözmez, ancak oldukça güvenilirdir
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;
}
Google.com'a ping atmak DNS çözümüne bağımlılık getirir. 8.8.8.8'e Ping atmak iyidir, ancak Google benden birkaç adım uzaklıktadır. Tek yapmam gereken bana internetteki en yakın şeyi ping atmak.
Ben yönlendirilebilir bir adres üzerinde bir şey bir cevap almak kadar hop # 1, sonra hop # 2, vb Ping için TTL özelliğini kullanabilirsiniz; bu düğüm yönlendirilebilir bir adresdeyse, o zaman internet üzerindedir. Çoğumuz için, hop # 1 yerel ağ geçidimiz / yönlendiricimiz olacak ve hop # 2, fiber bağlantımızın diğer tarafındaki ilk nokta olacaktır.
Bu kod benim için çalışıyor ve internette bana en yakın olana ping atıyor çünkü bu konudaki diğer bazı önerilere göre daha hızlı yanıt veriyor.
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;
}
}
}
Android'de nasıl uygulandığı aşağıda açıklanmıştır .
Kavramın bir kanıtı olarak, bu kodu C # diline çevirdim:
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
}
}
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;
}
}
Başka bir seçenek Vista ve Windows 7'de MSDN yazı için kullanılabilir Ağ Liste Yöneticisi API'sıdır burada . Makalede, bunu yapmanızı sağlayan kod örneklerini indirmek için bir bağlantı bulunmaktadır:
AppNetworkListUser nlmUser = new AppNetworkListUser();
Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString());
NETWORKLIST olarak görünecek COM sekmesinden ... Ağ Listesi 1.0 Tür Kitaplığı'na bir başvuru eklediğinizden emin olun.
İstisnayı yakalayarak bağlantıları test etmekten kaçının. çünkü bazen ağ bağlantısını kaybedebileceğimizi gerçekten bekliyoruz.
if (NetworkInterface.GetIsNetworkAvailable() &&
new Ping().Send(new IPAddress(new byte[] { 8, 8, 8, 8 }),2000).Status == IPStatus.Success)
//is online
else
//is offline
Bir ağ / bağlantı değişikliği olduğunda kullanıcıyı bilgilendirmek / işlem yapmak istiyorsanız.
NLM API'sini kullan:
Şahsen Anton ve moffeltje'nin cevabını en iyi buluyorum , ancak VMWare ve diğerleri tarafından kurulan sanal ağları hariç tutmak için bir kontrol ekledim.
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));
}
bool bb = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
if (bb == true)
MessageBox.Show("Internet connections are available");
else
MessageBox.Show("Internet connections are not available");
bb
, ağ internete bağlı olmasa bile yine de doğru olacaktır.
Ping'in çok iş parçacıklı versiyonu:
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";
}
}
}
Bunun imkansız olduğunu düşünmezdim, sadece basit değil.
Böyle bir şey inşa ettim ve evet mükemmel değil, ancak ilk adım önemlidir: herhangi bir ağ bağlantısı olup olmadığını kontrol etmek. Windows Api iyi bir iş çıkarmıyor, o zaman neden daha iyi bir iş yapmıyorsunuz?
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;
}
Oldukça basit, ancak özellikle çeşitli proxy yapılandırmalarını kontrol etmek istediğinizde, çek kalitesini iyileştirmeye gerçekten yardımcı olur.
Yani:
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;
}
}
Ağ durumunu ve internet bağlantısını izlemek için NetworkMonitor kullanın .
Örneklem:
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");
}
}
}
Giriş
Bazı senaryolarda, Internet uygulamalarının Windows uygulamalarında C # kodu kullanıp kullanmadığını kontrol etmeniz gerekir. Windows formlarında interneti kullanarak bir dosyayı indirmek veya yüklemek veya uzak konumdaki veritabanından bazı veriler almak olabilir, bu durumlarda internet kontrolü zorunludur.
Arkasındaki koddan C # kullanarak internet kullanılabilirliğini kontrol etmenin bazı yolları vardır. Bu tür tüm yollar, sınırlamaları da dahil olmak üzere burada açıklanmaktadır.
'Wininet' API'sı yerel sistemin aktif internet bağlantısına sahip olup olmadığını kontrol etmek için kullanılabilir. Bunun için kullanılan ad alanı 'System.Runtime.InteropServices' dir ve DllImport kullanarak 'wininet.dll' dll dosyasını içe aktarır. Bundan sonra, extern static fonksiyon fonksiyonuna sahip InternetGetConnectedState işlevinde iki parametre açıklamasıyla ve örnekte gösterildiği gibi saklıdırValue ile bir boolean değişkeni oluşturun.
Not: Harici değiştirici, harici olarak uygulanan bir yöntemi bildirmek için kullanılır. Yönetilmeyen koda çağrı yapmak için Interop hizmetlerini kullandığınızda extern değiştiricisinin yaygın kullanımı DllImport özniteliğidir. Bu durumda, yöntemin statik olarak da bildirilmesi gerekir.
Ardından, boole olarak 'IsInternetAvailable' adında bir yöntem oluşturun. Yerel sistemin internet durumunu döndüren bu yöntemde yukarıdaki fonksiyon kullanılacaktır.
[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;
}
}
Aşağıdaki örnek, bir ağ bağlantısının kullanılabilir olup olmadığını belirlemek için GetIsNetworkAvailable yöntemini kullanır.
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");
}
Açıklamalar (MSDN'ye göre): Herhangi bir ağ arabirimi "yukarı" olarak işaretlenmişse ve geri döngü veya tünel arabirimi değilse bir ağ bağlantısı kullanılabilir kabul edilir.
Bir aygıtın veya bilgisayarın yararlı bir ağa bağlı olmadığı, ancak yine de kullanılabilir olduğu kabul edilen pek çok durum vardır ve GetIsNetworkAvailable true değerini döndürür. Örneğin, uygulamayı çalıştıran cihaz proxy gerektiren bir kablosuz ağa bağlıysa ancak proxy ayarlanmamışsa, GetIsNetworkAvailable true değerini döndürecektir. GetIsNetworkAvailable'un ne zaman true döndüreceğine bir başka örnek, uygulamanın, hub veya yönlendiricinin yukarı akış bağlantısını kaybettiği bir hub veya yönlendiriciye bağlı bir bilgisayarda çalışıp çalışmadığıdır.
Ping ve PingReply sınıfları, uygulamanın ana bilgisayardan yanıt alarak uzak bir bilgisayarın ağ üzerinden erişilebilir olup olmadığını belirlemesine olanak tanır. Bu sınıflar System.Net.NetworkInformation ad alanında bulunabilir. Aşağıdaki örnek bir ana bilgisayara nasıl ping atılacağını gösterir.
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;
}
Açıklamalar (MSDN'e göre): Uygulamalar, uzak bir bilgisayarın erişilebilir olup olmadığını algılamak için Ping sınıfını kullanır. Ağ topolojisi, Ping'in uzaktaki bir ana bilgisayara başarıyla erişip erişemeyeceğini belirleyebilir. Proxy'lerin, ağ adresi çevirisi (NAT) ekipmanının veya güvenlik duvarlarının varlığı ve yapılandırması Ping'in başarılı olmasını engelleyebilir. Başarılı bir Ping, yalnızca uzak ana bilgisayara ağda erişilebildiğini gösterir; uzak ana bilgisayarda daha üst düzey hizmetlerin (Web sunucusu gibi) varlığı garanti edilmez.
Yorumlar / Öneriler davetlidir. Mutlu kodlama ......!
Uygulamam için küçük dosya indirerek de test ediyoruz.
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;
}
Ayrıca. Bazı İSS dosyaları önbelleğe almak için orta sunucuyu kullanabilir. Kullanılmayan rastgele parametre ekleyin örn. https://www.microsoft.com/favicon.ico?req=random_number Önbelleğe almayı önleyebilir.
İnternet bağlantısı kesilirse yönlendirici sayfayı yanıt sayfasına yönlendirir, bu yüzden hala bir buhar alırsınız ve kodunuz internet olduğunu düşünür. Elmaların (veya diğerlerinin) her zaman belirli bir yanıtı döndüren etkin nokta tespit sayfası vardır. Aşağıdaki örnek "Başarılı" yanıtı döndürür. Böylece internete bağlanabileceğinizden ve gerçek yanıt alabileceğinizden tam olarak emin olacaksınız!
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;
}
İnternet bağlantısı için üç testim var.
System.Net
veSystem.Net.Sockets
Test 1
public bool IsOnlineTest1()
{
try
{
IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
return true;
}
catch (SocketException ex)
{
return false;
}
}
Test 2
public bool IsOnlineTest2()
{
try
{
IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
return true;
}
catch (SocketException ex)
{
return false;
}
}
Test 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;
}
}
Testlerin yapılması
Eğer bir yaparsanız Dictionary
arasında String
ve Boolean
denir CheckList
, sen her testin sonuçlarını ekleyebilir CheckList
.
Şimdi, KeyValuePair
bir for...each
döngü kullanarak her birini tekrarlayın.
Bir CheckList
içeriyorsaValue
ait true
, o zaman bir Internet bağlantısı olduğunu biliyoruz.
public static bool HasConnection()
{
try
{
System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
return true;
}
catch
{
return false;
}
}
Bu işe yarıyor