Постоянно проверяйте подключение к интернету - PullRequest
5 голосов
/ 26 июня 2011

Как я могу постоянно проверять подключение к Интернету в моем приложении и отвечать, если подключение недоступно?

В настоящее время я использую:

while(true) {
 if(HasConnection()) {
     //doSomething..
  }
   //stop app by 1sec
}

, но это выглядит довольно не элегантно.

Ответы [ 9 ]

3 голосов
/ 26 июня 2011

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

2 голосов
/ 30 апреля 2012

Используйте следующий код:

public static class LocalSystemConnection
{
    [DllImport("wininet.dll", SetLastError=true, CallingConvention = CallingConvention.ThisCall)]
    extern static bool InternetGetConnectedState(out ConnectionStates lpdwFlags, long dwReserved);

    /// <summary>
    /// Retrieves the connected state of the local system.
    /// </summary>
    /// <param name="connectionStates">A <see cref="ConnectionStates"/> value that receives the connection description.</param>
    /// <returns>
    /// A return value of true indicates that either the modem connection is active, or a LAN connection is active and a proxy is properly configured for the LAN.
    /// A return value of false indicates that neither the modem nor the LAN is connected.
    /// If false is returned, the <see cref="ConnectionStates.Configured"/> flag may be set to indicate that autodial is configured to "always dial" but is not currently active.
    /// If autodial is not configured, the function returns false.
    /// </returns>
    public static bool IsConnectedToInternet(out ConnectionStates connectionStates)
    {
        connectionStates = ConnectionStates.Unknown;
        return InternetGetConnectedState(out connectionStates, 0);
    }

    /// <summary>
    /// Retrieves the connected state of the local system.
    /// </summary>
    /// <returns>
    /// A return value of true indicates that either the modem connection is active, or a LAN connection is active and a proxy is properly configured for the LAN.
    /// A return value of false indicates that neither the modem nor the LAN is connected.
    /// If false is returned, the <see cref="ConnectionStates.Configured"/> flag may be set to indicate that autodial is configured to "always dial" but is not currently active.
    /// If autodial is not configured, the function returns false.
    /// </returns>
    public static bool IsConnectedToInternet()
    {
        ConnectionStates state = ConnectionStates.Unknown;
        return IsConnectedToInternet(out state);
    }
}

[Flags]
public enum ConnectionStates
{
    /// <summary>
    /// Unknown state.
    /// </summary>
    Unknown = 0,

    /// <summary>
    /// Local system uses a modem to connect to the Internet.
    /// </summary>
    Modem = 0x1,

    /// <summary>
    /// Local system uses a local area network to connect to the Internet.
    /// </summary>
    LAN = 0x2,

    /// <summary>
    /// Local system uses a proxy server to connect to the Internet.
    /// </summary>
    Proxy = 0x4,

    /// <summary>
    /// Local system has RAS (Remote Access Services) installed.
    /// </summary>
    RasInstalled = 0x10,

    /// <summary>
    /// Local system is in offline mode.
    /// </summary>
    Offline = 0x20,

    /// <summary>
    /// Local system has a valid connection to the Internet, but it might or might not be currently connected.
    /// </summary>
    Configured = 0x40,
}
2 голосов
/ 26 июня 2011

Вы ищете событие NetworkAvailabilityChanged .

Чтобы проверить подключение к Интернету, вы можете ping на надежном веб-сайте, таком как Google.com.

Обратите внимание, что невозможно получить уведомление о при каждом изменении подключения к Интернету (например, о сбое интернет-провайдера).

1 голос
/ 12 августа 2018

, если вы хотите проверять непрерывно, используйте таймер

    private Timer timer1;
    public void InitTimer()
    {
        timer1 = new Timer();
        timer1.Tick += new EventHandler(timerEvent);
        timer1.Interval = 2000; // in miliseconds
        timer1.Start();
    }

    private void timerEvent(object sender, EventArgs e)
    {
        DoSomeThingWithInternet();
    }

     private void DoSomeThingWithInternet()
    {
        if (isConnected())
        {
           // inform user that "you're connected to internet"
        }
        else
        {
             // inform user that "you're not connected to internet"
        }
    }

    public static bool isConnected()
    {
        try
        {
            using (var client = new WebClient())
            using (client.OpenRead("http://clients3.google.com/generate_204"))
            {
                return true;
            }
        }
        catch
        {
            return false;
        }
    }
1 голос
/ 26 июня 2011

если вам нужно только знать, доступно ли хотя бы одно соединение, вы можете попробовать это:

InternetGetConnectedStateEx ()

http://msdn.microsoft.com/en-us/library/aa384705%28v=vs.85%29.aspx

0 голосов
/ 25 января 2019

Я знаю, что это старый вопрос, но он прекрасно работает для меня.

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged += NetworkChange_NetworkAvailabilityChanged;

private async void NetworkChange_NetworkAvailabilityChanged(object sender, System.Net.NetworkInformation.NetworkAvailabilityEventArgs e)
        {
            //code to execute...
        }

Я подписываюсь на событие для слушателя, и он постоянно проверяет соединение.это вы можете добавить оператор If, например:

if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
   {
        //Send Ping...
   }
else
    {
        //other code....
    }
0 голосов
/ 26 июня 2011

Вы можете проверить подключение к Интернету, выполнив команду ping на каком-либо веб-сайте, например:

    public bool IsConnectedToInternet
    {
        try
        {
            using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping())
            {
                string address = @"http://www.google.com";//                        System.Net.NetworkInformation.PingReply pingReplay = ping.Send(address);//you can specify timeout.
                if (pingReplay.Status == System.Net.NetworkInformation.IPStatus.Success)
                {
                    return true;
                }
             }
        }
        catch
        {
#if DEBUG
            System.Diagnostics.Debugger.Break();
#endif//DEBUG
        }

        return false;
    }
0 голосов
/ 26 июня 2011

Это было бы началом, но, как уже упоминал Сарнольд, есть много вещей, которые вы должны рассмотреть

0 голосов
/ 26 июня 2011

Как вы узнаете, есть ли у вас подключение к Интернету?Достаточно ли того, что вы можете маршрутизировать пакеты на соседний маршрутизатор?Может быть, на машине есть только один NIC, один шлюз, и, возможно, соединение с этим шлюзом обрывается, но машина все еще может маршрутизировать к шлюзу и локальной сети?

Может быть, на машине есть один NIC и дюжина шлюзов;может быть, они приходят и уходят все время, но один из них всегда работает?

Что, если на машине есть несколько сетевых карт, но только один шлюз?Возможно, он может маршрутизировать некоторые подмножества Интернета, но все еще имеет отличное соединение с локальной сетью, не подключенной к Интернету?

Что если на машине установлены несколько сетевых адаптеров, несколько шлюзов, но по причинам административной политики,все еще только части Интернета являются маршрутизируемыми?

Вы действительно заботитесь только о том, имеют ли клиенты подключение к вашим серверам?

Какая задержка между пакетами приемлема?(30 мс - это хорошо, 300 мсек - это предел человеческой выносливости, 3000 мс - недопустимо долгое время, 960000 мсек - это то, что потребуется для подключения к солнечному датчику.) Какой тип потери пакетов приемлем?

ЧтоВы действительно пытаетесь измерить?

...