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

Мне бы хотелось, чтобы мое приложение подключалось к серверу (для проверки обновлений) всякий раз, когда соединение доступно, но ничего не предпринимает, когда оно отсутствует. Я обеспокоен тем, что люди с коммутируемым соединением могут получать одно из этих приглашений для набора номера своего провайдера, когда моя программа пытается это сделать. Я понимаю, что в настоящее время очень мало людей пользуются модемной связью, но все же.

Я сам был отключен от телефонной линии более десяти лет, поэтому, честно говоря, понятия не имею, выполняю ли HTTP-запрос (например, с помощью WebRequest) в автономном режиме покажет такую ​​подсказку "дозвона". Будет ли он? Если так, как я могу проверить наличие обновлений, не вызывая такой подсказки?

2 ответа

Используя это:

My.Computer.Network.IsAvailable

И возможно это:

    Dim available As Boolean
    Try
        Dim client As New System.Net.Sockets.TcpClient("google.com", 80)
        available = True
    Catch ex As Exception
        available = False
    End Try

Если результат "доступен", вы можете проверить, доступно ли обновление.

WinInet Api реализует функцию:

BOOL InternetGetConnectedState(
  _Out_  LPDWORD lpdwFlags,
  _In_   DWORD dwReserved
);

Подробности специфического вызова API можно найти здесь


РЕДАКТИРОВАТЬ: я предоставил небольшой пример кода, который может быть использован для тестирования.
Стоит отметить, что под капотом, My.Computer.Network.IsAvailable P / Запускает InternetGetConnectedState и просто возвращает значение true/false при отбрасывании флагов. WinNt и позже он перечисляет через сетевые интерфейсы и возвращает true для первого подключенного интерфейса.

using System;

namespace InternetGetConnectedState
{
    [Flags]
    enum InternetConnectionFlags : uint
    {
        // Flags for InternetGetConnectedState and Ex
        Modem = 0x01,
        Lan = 0x02,
        Proxy = 0x04,
        ModemBusy = 0x08,  /* no longer used */
        RasInstalled = 0x10,
        Offline = 0x20,
        Configured = 0x40
    }

    class Program
    {
        [System.Runtime.InteropServices.DllImport("wininet.dll", SetLastError = true)]
        static extern bool InternetGetConnectedState(out InternetConnectionFlags flags, uint dwReserved);

        static void Main(string[] args)
        {
            InternetConnectionFlags flags;
            bool connectedState = InternetGetConnectedState(out flags, 0)

            // TODO:  Check Flags
        }
    }
}

РЕДАКТИРОВАТЬ 2: После дальнейшего просмотра дампа ILSpy, My.Computer.Network.IsAvailable P / Запускает InternetGetConnectedState в Windows до NT. На WinNt и позже он перечисляет через сетевые интерфейсы и возвращает true для первого подключенного интерфейса. Так что либо

My.Computer.Network.IsAvailable  'vb.net

или же

System.Net.NetworkInformation.GetIsNetworkAvailable(); // C#

являются жизнеспособными решениями.

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

Другие вопросы по тегам