Kullanılabilir bir ağ bağlantısı olup olmadığını belirlemenin en iyi yolu nedir?
Kullanılabilir bir ağ bağlantısı olup olmadığını belirlemenin en iyi yolu nedir?
Yanıtlar:
Aşağıdakileri kullanarak .NET 2.0'da bir ağ bağlantısını kontrol edebilirsiniz GetIsNetworkAvailable()
:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
IP adresindeki değişiklikleri veya ağ kullanılabilirliğindeki değişiklikleri izlemek için NetworkChange sınıfındaki olayları kullanın :
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
NetworkInterface.GetIsNetworkAvailable()
uygulamamda (.NET 4.5, Windows 10), özellikle sanal bir makinede çalışırken çok güvenilmezdi. Olayları ele almak NetworkAvailabilityChanged
güvenilirdi.
İşaretli cevap% 100 iyidir, ancak standart yöntemin sanal kartlar (sanal kutu, ...) tarafından kandırıldığı bazı durumlar vardır. Ayrıca, hızlarına (seri bağlantı noktaları, modemler, ...) bağlı olarak bazı ağ arabirimlerinin atılması da sıklıkla istenir.
İşte bu durumları kontrol eden bir kod parçası:
/// <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 ve 7, NCSI (Ağ Bağlantısı Durum Göstergesi) tekniğini kullanır:
Ağ Bağlantısını kontrol etmek için bu yöntemi çağırın.
public static bool IsConnectedToInternet()
{
bool returnValue = false;
try
{
int Desc;
returnValue = Utility.InternetGetConnectedState(out Desc, 0);
}
catch
{
returnValue = false;
}
return returnValue;
}
Bunu kod satırının altına koyun.
[DllImport("wininet.dll")]
public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);