2014-07-09 2 views
5

셀 서비스에 원격 트럭 용으로 작성된 응용 프로그램이 있습니다. 나는 아무것도하기 전에,이 클래스와 인터넷을 확인하고 있습니다 : 그것은 인터넷을 가지고있는 것처럼 어떤 경우에는셀룰러 네트워크에서 인터넷 연결 테스트

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

는 외부 휴대 장치의 표시등이 녹색 표시등이 있습니다. 내 테스트 클래스는 허위로 돌아가서 인터넷이 없다고 생각합니다.

그러면 드라이버는 인터넷 익스플로러를 열고 인터넷 익스플로러를 닫고 내 애플리케이션을 실행하며 위 테스트를 통과합니다.

사용자는 IE가 인터넷을 '깨워서'전송할 수 있다고 말합니다.

내 수업은 본질적으로 같은 일을하지 않습니까? 그렇지 않다면 IE와 마찬가지로 인터넷 연결을 '깨울 수 있습니까?'

+0

그냥 이론에 HasConnection을 설정,하지만 어쩌면 그 DNS 관련되어 있어야합니다. www.google.com을 확인하지 못했고 DNSCache 서비스가이 결과를 암기하여 작동해야 할 때조차도 서비스가 실패 할 때까지 계속 실패합니다. DNSCache를 비활성화하거나 IP 주소만을 사용하여 인터넷 연결을 테스트 할 수 있습니다 (예 : 핑 8.8.8.8). – Havenard

+0

다음은 또 다른 해결책입니다. http://social.msdn.microsoft.com/forums/en-US/7eda3979-6424-4702-89f4-1f586b613b01/flush-dns-cache – Havenard

답변

1

특정 모바일 OS에만 국한되어 있다고 표시하지 않았지만 정상적인 상자에서는 작동합니다. System.Net.NetworkInformation 네임 스페이스의 두 가지 기능을 활용하려고합니다.

NetworkChangedEvent에 등록하는 것으로 시작합니다. GetIsNetworkAvailable을 호출하면 루프백 인터페이스가 아닌 다른 NIC가 하나 이상 존재하면 아이디어를 얻을 수 있습니다.

연결이없는 경우 호스트에 ping을 보내 네트워크 계층을 웨이크 업 (wake-up)하려고합니다. Dns.GetHostEntry을 사용하여 호스트에 대해 알려진 모든 IP 주소를 얻습니다. 다음에 나는 Ping 주소를 하나씩 시도한다.

모든 호스트가 모든 상황에서 시간 초과로 연결되는 ICMP 트래픽을 허용하지는 않습니다. 그러나 그 사이에 네트워크를 사용할 수있게되면 NetworkChanged 이벤트는 해고 사실

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

감사합니다. 정보! – ErocM