Bir ağ bağlantısını nasıl kontrol ederim?


Yanıtlar:


153

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

9
Bu "sınırlı kullanılabilirlik" ile ilgileniyor mu?
tofutim

Bu her zaman WPF'de çalışmaz. Bazı dizüstü bilgisayarlar yanlış dönüyor ve bazıları doğru
dönüyor

Bu gerçekten çalışıyor mu? Bu satırı yeni yazdım ve yönlendiricimi kapattım ve hala doğru dönüyor!
Mushfiq

1
NetworkInterface.GetIsNetworkAvailable()uygulamamda (.NET 4.5, Windows 10), özellikle sanal bir makinede çalışırken çok güvenilmezdi. Olayları ele almak NetworkAvailabilityChangedgüvenilirdi.
eskimwier

Bu güvenilir değil. okumak stackoverflow.com/a/25779403/2377343
T.Todua

174

İş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;
    }

17
bu doğru ve birçok olumlu oyu hak ediyor - Kabul edilen yanıtta bahsedilen NetworkAvailabilityChanged olayının güvenilir bir şekilde tetiklenmediğini buldum, bu da muhtemelen bu yanıtta belirtildiği gibi sanal bağdaştırıcılardan kaynaklanıyor
Marek

1
Sanal makineler için ek kontrol için +1. Dün bu davayla karşılaştım. Ama yine de, adlarında 'sanal' olmadığı için bunun 'Hype-V'yi işlemediğini düşünüyorum.
Herdo

3
@Herdo - evet, kod mükemmel değil ve sanal dünyada mükemmel bir şey olabileceğini düşünmüyorum . Ama onu geliştirebilirsin.
Simon Mourier

@SimonMourier Haklısın. Sadece şunu not etmek istedim, eğer herhangi biri hala doğru döndürülürse, bağlantı yoksa -> Bu bir sorun olabilir :)
dönerse

1
@noelicus - Şimdiye kadar üzerinde çalıştığım projelerde, sunucu "kapalı" (ulaşılamaz) olarak algılandığında olayları artıran periyodik bir izleme / sorgulama sistemi (bir web sunucusunu hedeflediğim için basit HTTP GET istekleri) uyguladım HTTP ile) veya "yukarı" (tekrar ulaşılabilir). Genel durumda, sizin durumunuzda "güvenilir" in ne anlama geldiğini tanımlayabilir ve benzer bir mantık uygulayabilirsiniz.
Simon Mourier

9

Microsoft Windows Vista ve 7, NCSI (Ağ Bağlantısı Durum Göstergesi) tekniğini kullanır:

  1. NCSI, www.msftncsi.com'da bir DNS araması gerçekleştirir ve ardından http://www.msftncsi.com/ncsi.txt ister . Bu dosya bir düz metin dosyasıdır ve yalnızca ' Microsoft NCSI ' metnini içerir .
  2. NCSI, dns.msftncsi.com için bir DNS arama isteği gönderir. Bu DNS adresi 131.107.255.255'e çözümlenmelidir. Adres eşleşmezse, internet bağlantısının düzgün çalışmadığı varsayılır.

3
Bu harika, ancak teknik olarak bir 'ağın' kullanılabilirliği ile ilgili değil, daha çok 'http üzerinden internet bağlantım var mı?' Mükemmel ağ bağlantılarına sahip olabilirsiniz, ancak örneğin bağımsız bir lan üzerinde internet bağlantınız olmayabilir. Daha fazla bilgi om NCSI için bakınız: technet.microsoft.com/en-us/library/cc766017.aspx
MichielB

1

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.