.NET을 사용하여 인터넷 연결을 확인하는 가장 좋은 방법은 무엇입니까?


237

.NET에서 인터넷 연결을 확인하는 가장 빠르고 효율적인 방법은 무엇입니까?


6
사용자에게 인터넷 연결이있는 경우 사용자가 인터넷에 연결할 수있는 경우 이메일 로그를 보내려면
Mohit Deshpande

11
이메일을 보내십시오. 사용자가 연결되어 있지 않으면 어떤 종류의 예외 (어쨌든 처리해야 할 경우)가 수신 될 수 있습니다.
Seth

15
또한 사용자 인터넷에 연결되어 있는지 확인할 수있는 방법이 없습니다 . 그들이 과거에 연결되어 있는지 알 수 있습니다 . "bool c = IsConnected (); if (c) {DoSomething ();}"-IsConnected 호출과 DoSomething 호출 사이에 무선 네트워크 라우터의 플러그가 뽑 혔을 수 있습니다. IsConnected는 실제로 WasRecentlyConnected라고합니다.
Eric Lippert

Windows NLM API이것에 가장 좋습니다. stackoverflow.com/questions/5405895/…
Mahbubur Rahman

답변:


292

이와 같은 것이 작동해야합니다.

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
Google이 핑에 계속 응답한다고 보장 할 수는 없기 때문에 이것은 핑 (ping)보다 낫습니다. 반면에 www.google.com에서 HTML을 반환하지 않는 세상을 이미지로 만들 수는 없습니다.
Daniel Vassallo

3
@Daniel : 한편으로는 사실이지만, 한편으로는 실제로 웹 사이트를 다운로드하는 것은 약간의 오버 헤드입니다.
Leo

9
어느 쪽이든, 4KB를 다시 가져올 이유가 없습니다. 대신 client.OpenRead (url)을 사용하십시오. 예외가 발생하지 않으면 연결할 수있었습니다.
Josh M.

14
실제로 그렇게 효율적이지 않습니다. 인터넷을 사용하지 않으면 1 분 이상 내 프로그램을 시작할 수 있습니다. 아마도 DNS를 해결하려고 시도했기 때문일 것입니다. Pinging 8.8.8.8 (google dns)에서 3 초로 변경되었습니다.
MadBoy

8
I cannot image a world where www.google.com does not return some HTML예를 들어 중국의 @DanielVassallo ...
Jérôme MEVEL

84

인터넷 연결이 있는지 여부를 확실하게 확인할 수있는 방법 은 없습니다 (인터넷에 액세스하는 것을 의미한다고 가정).

그러나 google.com 또는 이와 유사한 것을 핑하는 것과 같이 사실상 오프라인이 아닌 리소스를 요청할 수 있습니다. 나는 이것이 효율적이라고 생각합니다.

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 "인터넷에 연결되어 있는지 확실하게 확인할 수있는 방법이 없습니다"
woz

6
이 모든 것은 핑할 때 Google이 작동하는지 확인하는 것입니다. 인터넷을 성공적으로 핑한 후 바로 다음 순간에 인터넷이 중단되면 어떻게해야합니까? 수행하기 전에 확인할 점이 없습니다.
dbasnett

12
그리고 이것이 내 대답의 주요 진술과 어떻게 모순됩니까?
Leo

10
"google.com"을 사용하면 해결해야하므로 시간이 더 걸립니다. 대신, IP를 사용하여 직접 핑하는 것이 더 빠릅니다. Google 퍼블릭 DNS IP 주소 ( 8.8.8.8또는 8.8.4.4)에 핑 (Ping )을 수행하면 문제가 없습니다.
Mangesh 2016 년

8
Beware - many schools and offices block the ping protocol.클라이언트가 사용할 응용 프로그램에이 방법을 사용 하는 경우 인터넷 확인 방법에 반대하는 것이 좋습니다
user1

42

확인하는 대신 작업 (웹 요청, 메일, ftp 등)을 수행하고 요청이 실패 할 수 있도록 준비하십시오. 확인이 성공하더라도 어쨌든 수행해야합니다.

다음을 고려하세요:

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

네트워크가 다운되면 핑 등과 같이 빠르게 작업이 실패합니다.

1 - start to perform action
2 - if the net is down(or goes down) the action will fail

9
권리! 그냥하세요 – 그러나 모든 결과에 대비하십시오.
Colonic Panic

3
다음 사항을 고려하십시오. x 시간 동안 네트워크가 다운 된 경우 무언가를 수행 해야합니다 (예 : 추적 로그, 라우터 재설정)
Abir

2
OP는 아니지만 인터넷을 사용할 수없는 경우 DEFAULT 100 SECOND TIMEOUT을 피하기 위해서입니다. HTTP 요청은 백그라운드 스레드에서 수행되므로 UI ​​스레드가 차단되지 않지만 백그라운드 스레드가 HTTP 요청에서 돌아와 종료 될 때까지 내 앱을 종료 할 수 없습니다. "행복한 매체"시간 초과 값을 찾으려고하기보다는 인터넷 연결이 끊어 졌다는 것을 알면 요청을 완전히 피하고 싶습니다.
Scott Smith

2
요점은 원격 서비스의 사용 가능 여부를 설명 할 수 없다는 것입니다. 또한 핑에 응답하지 않는 사이트는 어떻습니까?
dbasnett

또 다른 유스 케이스는 인터넷이 백업 되 자마자 경고하는 온라인 검사기입니다
Ben Philipp

28

NetworkInterface.GetIsNetworkAvailable매우 신뢰할 수 없습니다. VMware 또는 다른 LAN 연결 만 있으면 잘못된 결과가 반환됩니다. 또한 Dns.GetHostEntry방법에 관해서는 응용 프로그램을 배포 할 환경에서 테스트 URL이 차단 될 수 있는지에 대해서만 걱정했습니다.

그래서 내가 찾은 또 다른 방법은 InternetGetConnectedState방법을 사용 하는 것입니다. 내 코드는

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

테스트하는 동안 VMWare 플레이어를 설치할 때 InternetGetConnectedState가 true를 반환했습니다 (인터넷 연결이 끊어짐). 제어판 \ 네트워크 및 인터넷 \ 네트워크 연결 (VMNet1 및 VMNet8)에서 비활성화해야합니다.
HockeyJ

Ok Justin Oringer. 비록 내가 그것을 확인했지만 다시 확인해야합니다
Kamran Shahid

2
나에게 가장 좋은 방법은 여전히 ​​서비스 연결을 확인한 다음 루틴을 시작하는 것입니다 ... 예외를 피하고 싶었습니다.
바그너 베르톨리 니 주니어 19

4
이 코드는 네트워크 케이블이 연결되어 있는지 확인합니다.
HackerMan

14

Google에 핑 (ping)을 통한 인터넷 연결 테스트 :

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

7
이 답변과 함께 설명하면 질문의 원래 저자보다 많은 사람들에게 도움이 될 것입니다.
Boeckm

13
많은 학교와 사무실에서 핑 프로토콜을 차단합니다. 바보, 알아
Panic

핑 클래스를 찾을 수 없습니다. 저 좀 도와 주 시겠어요. UWP에서 일하고 있는데 네트워크 정보를 통과하는 다른 방법은 작동하지 않습니다
iam.Carrot

12

"연결 확인 후 즉시 연결이 끊어 질 수 있으므로 작업을 수행하기 전에 연결 확인의 요점은 무엇입니까?"라는 의견에 동의하지 않습니다. 개발자로서 우리가 수행하는 많은 프로그래밍 작업에는 확실히 불확실성이 있지만 불확실성을 수용 수준으로 낮추는 것은 도전의 일부입니다.

최근에 온라인 타일 서버에 연결된 매핑 기능을 포함하는 응용 프로그램을 만드는 데이 문제가 발생했습니다. 인터넷 연결이 부족한 경우이 기능을 사용할 수 없습니다.

이 페이지의 일부 응답은 매우 훌륭했지만 주로 연결이없는 경우 중단과 같은 많은 성능 문제가 발생했습니다.

다음은 이러한 답변 중 일부와 동료의 도움을 받아 사용한 솔루션입니다.

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

위에 나열된 모든 옵션을 보았으며 인터넷을 사용할 수 있는지 여부를 확인할 수있는 유일한 옵션은 "Ping"옵션입니다. 가져 오기 [DllImport("Wininet.dll")]및 / System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() 또는 NetworkInterface 클래스 의 다른 변형은 네트워크의 가용성을 감지하는 데 제대로 작동하지 않습니다. 이러한 방법은 네트워크 케이블이 연결되어 있는지 여부 만 확인합니다.

"핑 옵션"

if(연결 가능) 반품 true

if(연결을 사용할 수없고 네트워크 케이블이 연결되어 있음) 반환 false

if(네트워크 케이블이 연결되어 있지 않습니다) Throws an exception

네트워크 인터페이스

if(인터넷 이용 가능) 반품 True

if(인터넷을 사용할 수없고 네트워크 케이블이 연결되어 있음) True

if(네트워크 케이블이 연결되어 있지 않음) 반환 false

[DllImport ( "Wininet.dll")]

if(인터넷 이용 가능) 반품 True

if(인터넷을 사용할 수없고 네트워크 케이블이 연결되어 있음) True

if(네트워크 케이블이 연결되어 있지 않음) 반환 false

그래서의 경우 [DllImport("Wininet.dll")]NetworkInterface 인터넷 연결을 사용할 수 있는지 알 수있는 방법이 없습니다.


이것은 사실이 아닙니다. Wininet.dll을 가져 와서 네트워크 케이블을 연결했으며 시나리오 인터넷을 사용할 수없는 경우 올바른 결과를 얻었습니다.
Waldemar Gałęzinowski 2019

8

코드 확인과 실행 사이의 네트워크 다운 문제를 해결하지는 않지만 상당히 안정적입니다.

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

좋은 생각이지만 당신이 말한 것처럼 완벽하지 않을 수 있습니다. 나중에 확인하기 위해 보내고받은 바이트를 캐시 할 수 있습니다. 그래도 완벽하지는 않습니다.
Todd

이 코드는 작동하지 않습니다. 수정하십시오. 네트워크 케이블이 연결되어 있는지 확인합니다.
HackerMan

5

Pinging google.com은 DNS 확인 종속성을 도입합니다. Pinging 8.8.8.8은 괜찮지 만 Google은 나에게서 몇 홉 떨어져 있습니다. 내가해야 할 일은 인터넷에있는 가장 가까운 것을 핑하는 것입니다.

라우팅 가능한 주소에있는 것으로부터 응답을받을 때까지 Ping의 TTL 기능을 사용하여 홉 # 1을 핑한 다음 홉 # 2 등을 사용할 수 있습니다. 해당 노드가 라우팅 가능한 주소에 있으면 인터넷에 있습니다. 우리 대부분의 경우 홉 # 1은 로컬 게이트웨이 / 라우터가되고 홉 # 2는 광섬유 연결의 다른 쪽 또는 그 밖의 첫 번째 지점이됩니다.

이 코드는 저에게 효과적이며 인터넷에서 가장 가까운 것을 핑하고 있기 때문에이 스레드의 다른 제안보다 빠르게 응답합니다.

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에서 구현되는 방법은 다음과 같습니다 .

개념 증명으로이 코드를 C #으로 변환했습니다.

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

또 다른 옵션은 Vista 및 Windows 7에서 사용할 수있는 네트워크 목록 관리자 API입니다. MSDN 기사는 여기를 참조 하십시오 . 이 기사에는 다음을 수행 할 수있는 코드 샘플을 다운로드하는 링크가 있습니다.

AppNetworkListUser nlmUser = new AppNetworkListUser();
Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString());

COM 탭에서 Network List 1.0 Type Library에 대한 참조를 추가하십시오. NETWORKLIST로 표시됩니다.


7
eeeeww. .NET에서 COM 지옥을 사용하십니까?
jgauffin

@jgauffin 왜 .NET에서 COM을 피해야하는지 설명해 주시겠습니까? 내가 찾은 다른 솔루션에 비해 COM 솔루션은 꽤 잘 작동하는 것 같습니다.
inexcitus

2

예외를 포착하여 연결 테스트를 피하십시오. 우리는 때때로 네트워크 연결이 끊어 질 수 있기를 기대하기 때문입니다.

 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는 어디에서 왔습니까? 편집 : 나는 그것을 발견 : System.Net.NetworkInformation
inspire_coding


1

나는 개인적으로 Anton와 moffeltje 의 대답을 가장 잘 찾았 지만 VMWare와 다른 사람들이 설정 한 가상 네트워크를 제외시키는 체크를 추가했습니다.

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 () 문서에서 참고 : 네트워크 인터페이스가 "업"으로 표시되고 루프백 또는 터널 인터페이스가 아닌 경우 네트워크 연결이 사용 가능한 것으로 간주됩니다. 가상이 항상 인터페이스의 이름이나 설명에 있는지 알 수 없습니다. 그게 표준인가요?
Mike Cheel 2016 년

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
이 속도 및 게시 된 다른 솔루션보다 더 나은 방법과 관련된 정보를 추가 할 수 있습니까? 이렇게하면 질문을 완전히 해결하는 데 도움이됩니다.
Ren

8
이 옵션의 문제점 bb은 네트워크가 인터넷에 연결되지 않은 경우에도 여전히 유효 하다는 것입니다.
halfpastfour.am

2
이것이 직접 질문에 대한 답변이 아니라는 것은 사실이지만, Google 등을 핑 (Ping)하기 전에 사전 점검으로 GetIsNetworkAvailable을 사용하는 것이 여전히 유용하다고 생각합니다.
Ben Hughes

3
이 코드는 인터넷 연결 가능 여부를 알리지 않습니다. 인터넷없이 네트워크 케이블을 연결하면 true로 돌아갑니다.
HackerMan

1

핑의 멀티 스레드 버전 :

  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

나는 그것이 불가능하다고 생각하지 않을 것입니다.

나는 이와 같은 것을 만들었고 완벽하지는 않지만 첫 번째 단계는 필수적입니다. 네트워크 연결이 있는지 확인하는 것입니다. Windows Api는 훌륭한 작업을 수행하지 않으므로 더 나은 작업을 수행하지 않는 이유는 무엇입니까?

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

매우 간단하지만 특히 다양한 프록시 구성을 확인하려는 경우 검사 품질을 향상시키는 데 실제로 도움이됩니다.

그래서:

  • 네트워크 연결이 있는지 확인하십시오 (NetworkIsAvailable 기능을 향상시키기 위해 잘못된 긍정이있을 때 로그를 개발자에게 보냈을 수도 있습니다)
  • HTTP 핑
  • (각각 HTTP Ping이있는 프록시 구성을 통한주기)

1
@hackerman 이것은 명백한 첫 단계입니다. 코더는 두 번째 단계로 true를 반환하면 자신의 서버에 빠른 핑을 수행 할 수 있습니다. 중요하게도 이는 결함이있는 Windows API 방법에 대한 대안을 제공합니다. 나머지는 세부 사항입니다.
Todd

3
위조하다. 네트워크 인터페이스가 작동하지 않으면 인터넷이없는 것입니다. ui는 지연없이 즉시 업데이트 할 수 있으며 다른 호스트를 더 이상 확인하지 않아도됩니다.
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;
    }
}

답을 적어주세요. 코드 만있는 답변은 허용되지 않습니다.
ganchito55

치안을 위해 정책을 설명하는 것은 매우 자명 한 설명입니까?
롤백

0

NetworkMonitor 를 사용 하여 네트워크 상태 및 인터넷 연결을 모니터링 하십시오 .

견본:

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

좋은 생각하지만, 확인되지 인터넷 가용성 네트워크 가용성,
존 데 메트

이 클래스는 인터넷의 가용성도 확인합니다. SourceCode

문제는, 내가 그것을 시도,하지만 네트워크를 사용할 수 없었다 경우에만 해고
존 데 메트

0

소개

일부 시나리오에서는 인터넷을 사용할 수 있는지 여부를 Windows 응용 프로그램에서 C # 코드를 사용하는지 확인해야합니다. 인터넷을 사용하여 파일을 Windows 형식으로 다운로드하거나 업로드하거나 원격 위치에있는 데이터베이스에서 일부 데이터를 가져 오는 경우가 있습니다. 이러한 상황에서는 인터넷 검사가 필수입니다.

코드 뒤의 C #을 사용하여 인터넷 가용성을 확인하는 몇 가지 방법이 있습니다. 여기에는 제한 사항을 포함하여 모든 방법이 설명되어 있습니다.

  1. InternetGetConnectedState (wininet)

'wininet'API를 사용하여 로컬 시스템의 인터넷 연결이 활성화되어 있는지 확인할 수 있습니다. 여기에 사용 된 네임 스페이스는 'System.Runtime.InteropServices'이며 DllImport를 사용하여 dll 'wininet.dll'을 가져옵니다. 그런 다음 예제와 같이 두 개의 매개 변수 description 및 reservedValue를 가진 함수 이름 InternetGetConnectedState를 사용하여 extern static으로 부울 변수를 작성하십시오.

참고 : extern 수정자는 외부에서 구현되는 메소드를 선언하는 데 사용됩니다. extern 수정 자의 일반적인 사용은 Interop 서비스를 사용하여 관리되지 않는 코드를 호출 할 때 DllImport 특성과 함께 사용됩니다. 이 경우, 메소드는 정적으로 선언되어야합니다.

그런 다음 이름이 'IsInternetAvailable'인 부울로 메소드를 작성하십시오. 위의 기능은 로컬 시스템의 인터넷 상태를 반환하는이 방법에 사용됩니다

[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

다음 예제는 GetIsNetworkAvailable 메소드를 사용하여 네트워크 연결이 사용 가능한지 판별합니다.

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

설명 (MSDN 기준) : 네트워크 인터페이스가 "업"으로 표시되고 루프백 또는 터널 인터페이스가 아닌 경우 네트워크 연결을 사용할 수있는 것으로 간주됩니다.

장치 나 컴퓨터가 유용한 네트워크에 연결되어 있지 않지만 여전히 사용 가능한 것으로 간주되어 GetIsNetworkAvailable이 true를 반환하는 경우가 많습니다. 예를 들어 응용 프로그램을 실행하는 장치가 프록시가 필요한 무선 네트워크에 연결되어 있지만 프록시가 설정되어 있지 않으면 GetIsNetworkAvailable이 true를 반환합니다. GetIsNetworkAvailable이 true를 반환하는 또 다른 예는 허브 나 라우터가 업스트림 연결을 잃은 허브 나 라우터에 연결된 컴퓨터에서 응용 프로그램이 실행중인 경우입니다.

  1. 네트워크에서 호스트 이름 핑

Ping 및 PingReply 클래스를 사용하면 응용 프로그램은 호스트로부터 응답을 얻어 네트워크를 통해 원격 컴퓨터에 액세스 할 수 있는지 여부를 결정할 수 있습니다. 이러한 클래스는 System.Net.NetworkInformation 네임 스페이스에서 사용할 수 있습니다. 다음 예는 호스트를 ping하는 방법을 보여줍니다.

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

설명 (MSDN 기준) : 응용 프로그램은 Ping 클래스를 사용하여 원격 컴퓨터에 연결할 수 있는지 여부를 감지합니다. 네트워크 토폴로지는 Ping이 원격 호스트에 성공적으로 접속할 수 있는지 여부를 판별 할 수 있습니다. 프록시, NAT (Network Address Translation) 장비 또는 방화벽의 존재 및 구성으로 인해 Ping이 성공하지 못할 수 있습니다. 성공적인 Ping은 네트워크에서 원격 호스트에 도달 할 수 있음을 나타냅니다. 원격 호스트에 상위 레벨 서비스 (예 : 웹 서버)가있는 것은 보장되지 않습니다.

의견 / 제안이 초대됩니다. 행복한 코딩 ......!


-1

내 응용 프로그램의 경우 작은 파일을 다운로드하여 테스트합니다.

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

또한. 일부 ISP는 중간 서버를 사용하여 파일을 캐시 할 수 있습니다. 임의의 미사용 파라미터 추가 (예 : https://www.microsoft.com/favicon.ico?req=random_number 캐싱을 방지 할 수 있습니다.


-1

인터넷 연결이 끊어지면 라우터가 페이지를 응답 페이지로 리디렉션하므로 코드가 인터넷에 있다고 생각하기 때문에 3g 라우터 / 모뎀에서 해당 방법에 문제가 있습니다. Apple (또는 기타)은 항상 특정 응답을 반환하는 핫스팟 결정 페이지를 가지고 있습니다. 다음 샘플은 "성공"응답을 반환합니다. 따라서 인터넷에 연결하여 실제 응답을 얻을 수있을 것입니다.

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

인터넷 연결에 대한 세 가지 테스트가 있습니다.

  • 참조 System.NetSystem.Net.Sockets
  • 다음 테스트 기능을 추가하십시오.

시험 1

public bool IsOnlineTest1()
{
    try
    {
        IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
        return true;
    }
    catch (SocketException ex)
    {
        return false;
    }
}

시험 2

public bool IsOnlineTest2()
{
    try
    {
        IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com");
        return true;
    }
    catch (SocketException ex)
    {
        return false;
    }
}

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

테스트 수행

당신이 한 경우 Dictionary의를 String하고 Boolean전화 CheckList, 당신은 각 테스트의 결과를 추가 할 수 있습니다 CheckList.

이제 루프를 KeyValuePair사용하여 각각 을 for...each반복하십시오.

경우 CheckList포함 Valuetrue, 당신은 인터넷 연결이 알고있다.


-4
public static bool HasConnection()
{
    try
    {
        System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
        return true;
    }
    catch
    {
        return false;
    }
}

작동합니다


46
DNS 캐시에 Google의 IP가있는 경우 DNS 요청을 보내지 않으므로 연결되어 있지 않아도 true를 반환 할 수 있습니다.
Thomas Levesque
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.