Как проверить, доступно ли подключение к Интернету, не запрашивая диалог набора номера?
Мне бы хотелось, чтобы мое приложение подключалось к серверу (для проверки обновлений) всякий раз, когда соединение доступно, но ничего не предпринимает, когда оно отсутствует. Я обеспокоен тем, что люди с коммутируемым соединением могут получать одно из этих приглашений для набора номера своего провайдера, когда моя программа пытается это сделать. Я понимаю, что в настоящее время очень мало людей пользуются модемной связью, но все же.
Я сам был отключен от телефонной линии более десяти лет, поэтому, честно говоря, понятия не имею, выполняю ли 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#
являются жизнеспособными решениями.
Возможно, опция отключения автоматических обновлений является еще одним возможным решением, позволяющим избежать раздражения конечного пользователя.