2014-07-09 10 views
5

Hücre servisinde kullanmak üzere uzak kamyonlar için yazılmış bir uygulamam var. Hiçbir şey yapmadan önce, bu sınıfla internet kontrol ediyorum: Bu internet vardır sanki Bazı durumlardaİnternet bağlantısını hücresel şebekede test etme

using System.Net; 

namespace SSS.ServicesConfig.MiscClasses 
{ 
    public class VerifyInternetAccess 
    { 
    public static bool HasInternet() 
    { 
     try 
     { 
     using (var client = new WebClient()) 
     using (var stream = client.OpenRead("http://www.google.com")) 
     { 
      return true; 
     } 
     } 
     catch 
     { 
     return false; 
     } 
    } 
    } 
} 

, dış hücresel cihazda ışık yeşil ışık vardır. Test sınıfım yanlış geliyor ve internet olmadığını düşünüyor.

Sürücü internet explorer'ı açabilir, internet explorer'ı kapatabilir, uygulamayı derhal çalıştırabilir ve yukarıdaki testi geçer.

Kullanıcılar, IE'nin interneti “uyandırarak” aktarabileceğini söylüyor.

Sınıfım aslında aynı şeyi yapmıyor mu? Aksi takdirde, internet bağlantısının IE’yi nasıl yaptığı gibi uyandırabilirim?

+0

Sadece bir teoriye HasConnection ayarlanır, ancak belki de DNS ile ilgili olması gerekirdi. Www.google.com'u çözemediniz ve DNSCache Service bu sonucu ezberledi, bu yüzden çalıştığı zaman bile bir şey başarısız olursa, servis bir tekme verene kadar. DNSCache'yi devre dışı bırakabilir veya yalnızca IP adreslerini kullanarak internet bağlantınızı test edebilirsiniz, örneğin 8.8.8.8'e ping atabilirsiniz. – Havenard

+0

İşte başka bir çözüm: http://social.msdn.microsoft.com/forums/en-US/7eda3979-6424-4702-89f4-1f586b613b01/flush-dns-cache – Havenard

cevap

1

Belirli bir mobil işletim sistemi ile sınırlı olup olmadığınızı belirtmediniz, ancak bu normal bir kutuda çalışır. System.Net.NetworkInformation ad alanının iki özelliğini kullanıyorum.

NetworkChangedEvent için kayıt yaptırmaya başladım. GetIsNetworkAvailable numaralı telefonu arayarak, geri döngü arabirimi olmayan en az bir başka NIC varsa bir fikir alırsınız.

Bağlantı yoksa, bir ana bilgisayara ping işlemi yaparak ağ katmanını uyandırmaya çalışırım. Bir ana makine için bilinen tüm IP Adreslerini almak için Dns.GetHostEntry kullanıyorum. Ardından adrese birer birer Ping adresini denerim.

Tüm ana makinelerin, her koşulda zamanaşımına yol açacak ICMP trafiğine izin vermediğini unutmayın. Ancak bu arada ağ kullanılabilir hale gelirse NetworkChanged olayı harekete ve gerçek

public class VerifyInternetAccess 
{ 
    private static bool HasConnection = false; 
    static VerifyInternetAccess() 
    { 
     NetworkChange.NetworkAvailabilityChanged += (o, ca) => 
      { 
       HasConnection = ca.IsAvailable; 
      }; 

     HasConnection = NetworkInterface.GetIsNetworkAvailable(); 
    } 

    public static bool HasInternet() 
    { 
     bool hasEnded = false; 
     if (!HasConnection) 
     { 
      // let's try to wake up... 
      using (var ping = new Ping()) 
      { 
       var iphost = Dns.GetHostEntry("www.google.com"); 

       foreach (var addr in iphost.AddressList) 
       { 
        var reply = ping.Send(addr); 
        if (reply.Status == IPStatus.Success) 
        { 
         HasConnection = true; 
         break; 
        } 
       } 
      } 
     } 
     return HasConnection; 
    } 
} 
+0

Bunu bir şans vereceğim bilgi! – ErocM