.NET kullanarak İnternet bağlantısını kontrol etmenin en iyi yolu nedir?


237

.NET'te Internet bağlantısını kontrol etmenin en hızlı ve en etkili yolu nedir?


6
Kullanıcının İnternet bağlantısı varsa. Kullanıcı internete bağlanabiliyorsa. Bir e-posta günlüğü göndermek için.
Mohit Deshpande

11
Sadece e-postayı gönderin. Kullanıcı bağlı değilse, büyük olasılıkla bir tür istisna alırsınız (muhtemelen yine de ele almanız gerekir).
Seth

15
Ayrıca, not kullanıcı eğer kontrol etmenin imkânsız olduğunu edilir internete bağlı; söyleyebileceğin tek şey geçmişte bağlı olup olmadıkları . Bir yönteminiz olduğunu varsayalım: "bool c = IsConnected (); eğer (c) {DoSomething ();}" - IsConnected çağrısı ile DoSomething çağrısı arasında kablosuz ağ yönlendiricisinin fişi çekilmiş olabilir. IsConnected gerçekten WasRecentlyConnected olarak adlandırılmalıdır.
Eric Lippert

Windows NLM APIbunun için en iyisi olmalı. stackoverflow.com/questions/5405895/…
Mahbubur Rahman

Yanıtlar:


292

Böyle bir şey işe yaramalı.

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;
    }
}

18
Bu muhtemelen Google'a ping atmaktan daha iyidir, çünkü Google'ın ping'lere yanıt vermeye devam edeceğine dair hiçbir garantimiz olmadığını düşünüyorum. Öte yandan, www.google.com'un HTML döndürmediği bir dünyayı görüntüleyemiyorum :)
Daniel Vassallo

3
@Daniel: bir yandan doğru, ancak diğer yandan, aslında web sitesini indirmek biraz havai bir imo
Leo

9
Her iki durumda da, 4KB'yi geri çekmek için bir neden yok - sadece client.OpenRead (url) kullanın. Bir istisna atmazsa bağlanabiliyordu.
Josh M.

14
Aslında bu o kadar verimli değil. Bunu kullanmak, internet yoksa programımı 1 dakikadan fazla bir süre içinde başlatır. Muhtemelen DNS'yi çözmeye çalıştığı için. Ping Ping 8.8.8.8 (google dns) bunu 3 saniye olarak değiştirdi.
MadBoy

8
Çin'deki @DanielVassallo I cannot image a world where www.google.com does not return some HTML, örneğin ...
Jérôme MEVEL

84

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;
}

24
+1 "Kesinlikle internet bağlantısı olup olmadığını kontrol etmenin bir yolu yok"
woz

6
Tüm bunlar, Google'a ping attığınız zaman kontrol edildiğini kontrol etmektir. Eğer başarılı ping sonra bir sonraki an iner sonra o zaman ne? Yapmadan önce kontrol etmenin bir anlamı yok.
dbasnett

12
Ve bu cevabımın ana ifadesiyle nasıl çelişiyor?
Leo

10
"Google.com" un kullanılması daha fazla zaman alacaktır çünkü çözülmesi gerekiyor. Bunun yerine, doğrudan IP kullanarak ping işlemi yapmak daha hızlı olacaktır. Google Herkese Açık DNS IP adreslerine ( 8.8.8.8veya 8.8.4.4) ping atmak benim için iyi çalışıyor.
Mangesh

8
Ben 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
kullanıcı1

42

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

9
Sağ! Sadece yap - ama tüm sonuçlara hazırlıklı ol.
Albay Panik

3
Aşağıdakileri göz önünde bulundurun: Ağ x zaman aşımına uğramışsa bir şeyler yapmanız gerekir (örn. Tracelog, yönlendirici sıfırlama)
Abir

2
OP değil, ama bunu yapmak istememin nedeni, İnternet bağlantısı mevcut değilse VARSAYILAN 100 İKİNCİ ZAMANINDA KAÇINMAK. HTTP isteği bir arka plan iş parçacığında yapılır, bu nedenle UI iş parçacığı engellenmez, ancak arka plan iş parçacığı HTTP isteğinden dönüp sonlanana kadar uygulamam çıkamaz. Bazı "mutlu orta" zaman aşımı değeri bulmaya çalışmak yerine, sadece internet bağlantısının kesildiğini bilsem isteği tamamen önlemek istiyorum.
Scott Smith

2
Demek istediğim, uzak hizmetin ne zaman kullanılabilir / kullanılamayacağını hesaba katamayacağımızdı. Ayrıca, pinglere yanıt vermeyen siteler ne olacak?
dbasnett

Başka bir kullanım örneği, internetim geri döndüğünde beni uyaracak bir çevrimiçi denetleyicidir
Ben Philipp

28

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.GetHostEntryyö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 InternetGetConnectedStateyö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);         
}

Test sırasında, VMWare oynatıcı yüklendiğinde (internet bağlantısı kesildi) InternetGetConnectedState öğesinin true döndürdüğünü buldum. Denetim Masası \ Ağ ve Internet \ Ağ Bağlantıları (VMNet1 ve VMNet8) içinde devre dışı bırakmak zorunda kaldı.
HockeyJ

Tamam Justin Oringer. Kontrol ettim ama tekrar doğrulamak zorundayım
Kamran Shahid

2
Benim için en iyi yaklaşım, bundan sonra hizmet bağlantımı hala kontrol ediyorum, sonra rutinleri başlatıyorum ... Sadece istisnalardan kaçınmak istedim.
Wagner Bertolini Junior

4
Bu kod yalnızca ağ kablosunun takılı olup olmadığını kontrol eder.
HackerMan

14

Google'a ping komutu göndererek İnternet bağlantısı testi:

new Ping().Send("www.google.com.mx").Status == IPStatus.Success

7
Bu cevapla birlikte yapılacak bir açıklama, sorunun orijinal yazarından daha fazla insan için faydalı olacaktır.
Kasım'da Boeckm

13
Dikkat - birçok okul ve ofis ping protokolünü engeller. Aptalca, biliyorum.
Albay Panik

Ping sınıfını bulamıyorum. Lütfen bana yardım eder misiniz. UWP üzerinde çalışıyorum ve ağ bilgisinden
geçmenin diğer yolları

12

Ş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
            }));
        }
    }

11

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.


Bu doğru değil, ben Wininet.dll ithal, ağ kablosu takılı ve senaryo internet mevcut olmadığı için doğru sonucu aldım.
Waldemar Gałęzinowski

8

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;
}

Harika fikir, ama dediğin gibi mükemmel olmayabilir. Gelecekteki kontroller için gönderilen / alınan baytları da önbelleğe alabilirsiniz. Yine de mükemmel değil.
Todd

Bu kod çalışmıyor, lütfen düzeltin. Yalnızca ağ kablosunun takılı olup olmadığını kontrol eder.
HackerMan

5

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;
        }
    }
}

4

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
    }
}

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;
    }
}

2

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.


7
eeeeww. .NET'te COM cehennemi mi kullanıyorsunuz?
jgauffin

@jgauffin Birinin neden .NET'te COM'dan kaçınması gerektiğini açıklayabilir misiniz? Bulduğum diğer çözümlerle karşılaştırıldığında, COM çözümü oldukça iyi çalışıyor gibi görünüyor.
19'da

2

İ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

1
NetworkInterface nereden geliyor? EDIT: Ben buldum: System.Net.NetworkInformation
inspire_coding


1

Ş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));
}

GetIsNetworkAvailable () belgelerinden FYI: 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. Sanalın her zaman inteface adında veya açıklamasında olup olmayacağını bilmiyorum. Bu standart mı?
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");

1
Bunun hızı ve bunun yayınlanan diğer çözümlerden daha iyi olduğu hakkında bilgi ekleyebilir misiniz? Bu, sorunun tam olarak ele alınmasında cevabınıza yardımcı olacaktır.
Ren

8
Bu seçenekle ilgili sorun bb, ağ internete bağlı olmasa bile yine de doğru olacaktır.
halfpastfour.am

2
Bu doğrudan soruya cevap vermez doğru olsa da, bunun vs. Google'a ping çalışmadan önce bir ön kontrol olarak GetIsNetworkAvailable kullanmak hala yararlı olduğunu düşünüyorum
Ben Hughes

3
Bu Kod, İnternet Bağlantısının Var olup olmadığını söylemez. İnternet olmadan bir ağ kablosu takarsanız, doğru döner.
HackerMan

1

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";
          }
      }
  }

0

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:

  • Ağ bağlantısının olup olmadığını kontrol edin (bunu gerçekten iyi yapın, belki de NetworkIsAvailable işlevini iyileştirmek için yanlış pozitifler olduğunda geliştiricilere günlükleri geri gönderin)
  • HTTP Ping
  • (Her birinde HTTP Ping ile Proxy yapılandırmaları arasında geçiş yapın)

1
@hackerman bu açık olmayan ilk adım. Kodlayıcılar, ikinci bir adım olarak doğruysa kendi sunucularına hızlı bir ping işlemi gerçekleştirebilir. Önemlisi, bu kusurlu windows api yöntemine bir alternatif sağlar. Gerisi detaylar.
Todd

3
Sahte olmak. Hiçbir ağ arabirimi yoksa, kesinlikle internet yoktur. Kullanıcı arabirimi, herhangi bir gecikme olmadan, diğer ana bilgisayarlarda başka denetim yapılmadan hemen güncellenebilir.
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;
    }
}

Lütfen cevabınızı yorumlayın. Yalnızca kod içeren yanıtlara izin verilmez.
ganchito55

Polislik uğruna polislik yapmak oldukça açıklayıcı mıdır?
yuvarlanıyor

0

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");
        }
    }
}

Güzel fikir, ancak ağ kullanılabilirliğini kontrol eder, internet kullanılabilirliğini kontrol etmez
John Demetriou

Bu sınıf ayrıca İnternet durumunu kontrol edin: SourceCode

şey şu ki, denedim, ancak sadece hiçbir ağ mevcut değilse ateşlendi
John Demetriou

0

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.

  1. InternetGetConnectedState (wininet)

'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;
    }
}
  1. GetIsNetworkAvailable

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.

  1. Ağdaki bir ana bilgisayar adına ping gönderme

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 ......!


-1

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.


-1

İ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;
}

-2

İnternet bağlantısı için üç testim var.

  • Referans System.NetveSystem.Net.Sockets
  • Aşağıdaki test işlevlerini ekleyin:

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 Dictionaryarasında Stringve Booleandenir CheckList, sen her testin sonuçlarını ekleyebilir CheckList.

Şimdi, KeyValuePairbir for...eachdöngü kullanarak her birini tekrarlayın.

Bir CheckListiçeriyorsaValue ait true, o zaman bir Internet bağlantısı olduğunu biliyoruz.


-4
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


46
DNS önbelleğinizde Google'ın IP'si varsa, bir DNS isteği göndermez, bu yüzden bağlı olmasanız bile doğru dönebilir
Thomas Levesque
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.