Подтвердить что ты не робот

С# проверка подключения к Интернету

Не могли бы вы рассказать мне, есть ли способ проверить, есть ли подключение к Интернету на моем компьютере, когда запущена моя программа на С#. Для простого примера, если интернет работает, я бы вывел окно с сообщением Internet is available. иначе я бы вывел сообщение с сообщением Internet is unavailable.

Без использования функции библиотеки, чтобы узнать, доступна ли сеть (так как это не проверяет подключение к Интернету)

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

Или не открывая веб-страницу и не проверяя, возвращают ли она данные

using (WebClient client = new WebClient())
      htmlCode = client.DownloadString("http://google.com");

Потому что оба этих метода не соответствуют моим потребностям.

4b9b3361

Ответ 1

немного более короткая версия:

public static bool CheckForInternetConnection()
{
    try
    {
        using (var client = new WebClient())
        using (var stream = client.OpenRead("http://www.google.com"))
        {
            return true;
        }
    }
    catch
    {
        return false;
    }
}

Другой вариант:

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) {
  // presumably online
}

Вы можете найти более широкое обсуждение здесь

Ответ 2

Рассмотрим следующий фрагмент кода...

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) 
{
  // presumably online
}

Удачи!

Ответ 3

просто написал async-функции для этого:

private void myPingCompletedCallback(object sender, PingCompletedEventArgs e)
{
    if (e.Cancelled)
        return;

    if (e.Error != null)
        return;

    if (e.Reply.Status == IPStatus.Success)
    {
        //ok connected to internet, do something...
    }
}

private void checkInternet()
{
    Ping myPing = new Ping();
    myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback);
    try
    {
        myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true));
    }
    catch
    {
    }
}

Ответ 4

Теперь мой класс NetworkMonitor предоставляет (на основе других ответов здесь):

    public bool IsInternetAvailable
    {
        get { return IsNetworkAvailable && _CanPingGoogle(); }
    }

    private static bool _CanPingGoogle()
    {
        const int timeout = 1000;
        const string host = "google.com";

        var ping = new Ping();
        var buffer = new byte[32];
        var pingOptions = new PingOptions();

        try {
            var reply = ping.Send(host, timeout, buffer, pingOptions);
            return (reply != null && reply.Status == IPStatus.Success);
        }
        catch (Exception) {
            return false;
        }
    }

Ответ 5

Это мой подход;

  • Убедитесь, что сетевое соединение доступно, если это не так, мы не сможем подключиться к другому хосту.
  • Проверьте, можем ли мы подключиться к некоторым основным узлам. Используйте резервную копию только в том случае, если сайт недоступен.

    public static bool ConnectToInternet(int timeout_per_host_millis = 1000, string[] hosts_to_ping = null)
    {
        bool network_available = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
    
        if (network_available)
        {
            string[] hosts = hosts_to_ping ?? new string[] { "www.google.com", "www.facebook.com" };
    
            Ping p = new Ping();
    
            foreach (string host in hosts)
            {
                try
                {
                    PingReply r = p.Send(host, timeout_per_host_millis);
    
                    if (r.Status == IPStatus.Success)
                        return true;
                }
                catch { }
            }
        }
    
        return false;
    }
    

Примечания:

  • Не используйте слишком много хостов при достижении цели, взвесьте стоимость во время выполнения всех попыток с уменьшающейся вероятностью успеха.
  • Если мы отправим запрос на определенный хост, на который мы намерены подключиться позже (например, HTTP-запрос), возвращаемый пинг не означает, что мы подключены к этому конкретному хосту. Подумайте, что произойдет, если хост заблокирован. например, Facebook заблокирован в Иране, Китае,... Идет ли этот ISP пинг?
  • DNS-запрос не будет достаточным, поскольку он может быть кэширован

Ответ 6

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