Câu trả lời:
Bạn có thể kiểm tra kết nối mạng trong .NET 2.0 bằng cách sử dụng GetIsNetworkAvailable()
:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
Để theo dõi những thay đổi về địa chỉ IP hoặc những thay đổi về tính khả dụng của mạng, hãy sử dụng các sự kiện từ lớp NetworkChange :
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
NetworkInterface.GetIsNetworkAvailable()
rất không đáng tin cậy trong ứng dụng của tôi (.NET 4.5, Windows 10), đặc biệt khi chạy trong máy ảo. Xử lý các sự kiện từ NetworkAvailabilityChanged
đã đáng tin cậy.
Câu trả lời được đánh dấu là 100% tốt, tuy nhiên, có một số trường hợp khi phương pháp tiêu chuẩn bị đánh lừa bởi các thẻ ảo (ô ảo, ...). Bạn cũng thường muốn loại bỏ một số giao diện mạng dựa trên tốc độ của chúng (cổng nối tiếp, modem, ...).
Đây là một đoạn mã kiểm tra các trường hợp này:
/// <summary>
/// Indicates whether any network connection is available
/// Filter connections below a specified speed, as well as virtual network cards.
/// </summary>
/// <returns>
/// <c>true</c> if a network connection is available; otherwise, <c>false</c>.
/// </returns>
public static bool IsNetworkAvailable()
{
return IsNetworkAvailable(0);
}
/// <summary>
/// Indicates whether any network connection is available.
/// Filter connections below a specified speed, as well as virtual network cards.
/// </summary>
/// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param>
/// <returns>
/// <c>true</c> if a network connection is available; otherwise, <c>false</c>.
/// </returns>
public static bool IsNetworkAvailable(long minimumSpeed)
{
if (!NetworkInterface.GetIsNetworkAvailable())
return false;
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
// discard because of standard reasons
if ((ni.OperationalStatus != OperationalStatus.Up) ||
(ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) ||
(ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel))
continue;
// this allow to filter modems, serial, etc.
// I use 10000000 as a minimum speed for most cases
if (ni.Speed < minimumSpeed)
continue;
// discard virtual cards (virtual box, virtual pc, etc.)
if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) ||
(ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0))
continue;
// discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card.
if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase))
continue;
return true;
}
return false;
}
Microsoft windows vista và 7 sử dụng kỹ thuật NCSI (Chỉ báo trạng thái kết nối mạng):
Gọi phương thức này để kiểm tra Kết nối mạng.
public static bool IsConnectedToInternet()
{
bool returnValue = false;
try
{
int Desc;
returnValue = Utility.InternetGetConnectedState(out Desc, 0);
}
catch
{
returnValue = false;
}
return returnValue;
}
Đặt dòng mã này bên dưới.
[DllImport("wininet.dll")]
public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);