Есть несколько способов сделать это (я думаю, вы можете использовать комбинацию [2] и [3]).
Раствор 1
Если вы включите ссылку на Microsoft.VisualBasic
, вы можете использовать свойство Microsoft.VisualBasic.Devices.Network.IsAvailable
, чтобы проверить, доступно ли сетевое соединение (и связанные события, которые будут уведомлены, когда это условие изменится).
Раствор 2
Импортируйте функцию API, чтобы проверить это:
[Flags]
enum InternetConnectionState : int
{
INTERNET_CONNECTION_MODEM = 0x1,
INTERNET_CONNECTION_LAN = 0x2,
INTERNET_CONNECTION_PROXY = 0x4,
INTERNET_RAS_INSTALLED = 0x10,
INTERNET_CONNECTION_OFFLINE = 0x20,
INTERNET_CONNECTION_CONFIGURED = 0x40
}
[DllImport("WININET", CharSet=CharSet.Auto)]
static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);
Или просто используйте функцию System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
(лучшее решение, единственным недостатком является то, что он поддерживается в профиле клиента только с 4.0).
Решение 3
Пропингуйте известное имя хоста, например, Google или Microsoft (это также проверит DNS).
Пример * * тысяча двадцать-одна
Используйте комбинацию вышеуказанных методов (в этом примере я использую импортированный API, но вы можете предпочесть другой).
static class NetworkHelpers
{
public static bool IsNetworkConnectionAvailable()
{
InternetConnectionState state = InternetConnectionState.INTERNET_CONNECTION_OFFLINE;
if (!InternetGetConnectedState(ref state, 0))
return false;
if (state == InternetConnectionState.INTERNET_CONNECTION_OFFLINE)
return false;
try
{
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply reply = ping.Send(KnownHostName, PingTimeout);
return reply.Status == System.Net.NetworkInformation.IPStatus.Success;
}
catch (System.Net.NetworkInformation.PingException)
{
return false;
}
}
private const string KnownHostName = "http://www.microsoft.com";
private const int PingTimeout = 5000; // milliseconds
[Flags]
private enum InternetConnectionState : int
{
INTERNET_CONNECTION_MODEM = 0x1,
INTERNET_CONNECTION_LAN = 0x2,
INTERNET_CONNECTION_PROXY = 0x4,
INTERNET_RAS_INSTALLED = 0x10,
INTERNET_CONNECTION_OFFLINE = 0x20,
INTERNET_CONNECTION_CONFIGURED = 0x40
}
[System.Runtime.InteropServices.DllImport("WININET", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);
}