Soru İnternet bağlantısının C # ile mevcut olup olmadığını kontrol edin


İnternet bağlantısının programlı olup olmadığını kontrol etmenin en kolay yolu nedir?

DÜZENLE: Önerildiği gibi, aşağıdaki yöntemi kullanmayı denedim, ancak her zaman doğrudur.

[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
}

class Program
{
    [DllImport("WININET", CharSet = CharSet.Auto)]
    static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved);

static void Main(string[] args)
{
    InternetConnectionState flags = 0;
    bool isConnected = InternetGetConnectedState(ref flags, 0);
    Console.WriteLine(isConnected);
    //Console.WriteLine(flags);
    Console.ReadKey();
}
}

Ek Bilgi (yardımcı oluyorsa): Paylaşılan bir kablosuz ağ üzerinden internete erişiyorum.


25
2017-07-05 23:19


Menşei


Hangi API'nın işlediğinden emin değilim, ancak Windows Vista'da ve aslında İnternet bağlantınızı doğrular. Bu bilginin bir API'da göründüğüne eminim. Bu nedenle, Vista ve gelecek Windows 7 için en iyi şekilde çalışan bir çözüm arıyorsanız, ister istemez, başka biri de hangisi öyle. - jasonh
7 ile çalışmak için ona ihtiyacım var
Önerilen çözümün sonuçlarını içeren soruyu düzenledi. Benim için çalışmıyor, lütfen yardım edin. Teşekkürler!
Aynı sorunu uzun süre önce de gördüm. Farklı çözümler denedi, ancak aynı yerde kaldı! - blitzkriegz
InternetGetConnectedState sadece zincirdeki ilk testtir - çevirmeli bağlantınızın bağlı olup olmadığını (çevirmeli bağlantı kullanıyorsanız) size bildirmek istenir. Eğer bir lan bağlantınız varsa (neredeyse) her zaman doğru döner. InternetGetConnectedState'den doğru alırsanız, ek testlere devam edebilirsiniz, ör. ad çözümlemesi yapıp yapamayacağınızı kontrol edin, bağlanmak istediğiniz ana bilgisayar (lar) a erişebilirseniz, sonunda kullanacağınız bağlantı noktalarını ve protokolleri kullanın. Cevabımı daha da aşağıya bakın. - KristoferA


Cevaplar:


İşte arayabileceğiniz Windows API'sıdır. Wininet.dll içinde ve denir InternetGetConnectedState.

using System;
using System.Runtime;
using System.Runtime.InteropServices;

public class InternetCS
{
    //Creating the extern function...
    [DllImport("wininet.dll")]
    private extern static bool InternetGetConnectedState( out int Description, int ReservedValue );

    //Creating a function that uses the API function...
    public static bool IsConnectedToInternet( )
    {
        int Desc ;
        return InternetGetConnectedState( out Desc, 0 ) ;
    }
}

20
2017-07-05 23:24



bu derleme değil
@colithium: ref ve out gelmeli önce parametre bildirimi. int out geçerli değil. - Mehrdad Afshari
@Michell: Şimdi derlemeliyiz. Tabii ki bir Main yöntem. - Mehrdad Afshari
Çevirmeli bağlantı kullanıyorsanız, bağlantı / bağlantısız durumu kontrol etmek için harika bir çözümdür, ancak bir LAN bağlantısı kullanıyorsanız yanlış pozitif değerler verebilir. - KristoferA
Bu işlevin MSDN girdisi, açıklamalarında "Yerel sistem kullanır" olan INTERNET_CONNECTION_LAN, INTERNET_CONNECTION_MODEM ve INTERNET_CONNECTION_PROXY gibi bayraklar döndürdüğünü belirtir. x İnternete bağlanmak için. "Ve de diyor ki" InternetGetConnectedState'den TRUE'nin bir dönüş değeri, Internet'e en az bir bağlantının olduğunu gösterir. " - colithium


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

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


10
2018-01-09 15:07



Burada en iyi cevap budur. Diğer cevaplar, sadece doğru sonuçları (özellikle System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable ()) ve diğer yanıtları yalnızca DNS (DNS sunucularınız kapalı olabilir, ancak hala Internet bağlantınız olabilir) sağlamazsa, NCSI yaklaşımı önce DNS'i denetler ve Bu başarısız olursa, doğrudan IP adresi üzerinden bağlanmaya çalışır, böylece internetinizin gerçekten kapalı mı yoksa DNS'inizin kapalı mı olduğunu belirleyebilir. Görmek technet.microsoft.com/en-us/library/ee126135%28v=WS.10%29.aspx - public wireless


Bunu .NET 2.0 + 'da kullanarak bir ağ bağlantısını kontrol edebilirsiniz.

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

Bu muhtemelen dönecek true Yerel ağlar için, bu yüzden sizin için çalışmayabilir.


7
2017-07-05 23:29



MSDN: "Herhangi bir ağ arabirimi" yukarı "olarak işaretlenmiş ve geri döngü veya tünel arabirimi olmayan bir ağ bağlantısı kullanılabilir olarak kabul edilir." Dolayısıyla, ağ bağlantısının internet bağlantısı olduğunu garanti etmez. Yine de yararlı. - colithium
@colithium Yanıtımı bunu yansıtacak şekilde güncelledim. - mkchandler


Bu, cevabın gerçekten "buna bağlı" olduğu bir sorudur. Neden kontrol etmek istediğinize ve ne tür bir bağlantıya bağlı olduğuna bağlı? Http üzerinden belirli web sitelerine / hizmetlerine erişmek ister misiniz? Smtp postası gönderilsin mi? Dell aramaları mı yapıyorsun?

Önceki cevapların bir kombinasyonunu kullanmak muhtemelen gidilecek yoldur - önce herhangi bir bağlantının mevcut olup olmadığını kontrol etmek için colininium cevabından wininet API'yi kullanın.

Öyleyse, ilgilendiğiniz kaynaklar veya bazı popüler büyük web siteleri (google, altavista, compuserve, vb ...) için birkaç dns araması (bkz. System.Net.Dns) deneyin.

Ardından, ping yapmayı deneyebilirsiniz (bkz. Roger Willcocks'un cevabı) ve / veya aynı sitelere soket bağlantısı kurabilirsiniz. Başarısız bir pingin, güvenlik duvarı kurallarının ping yapmanıza izin vermediği anlamına gelebileceğini unutmayın.

Neden kontrol etmek istediğiniz konusunda daha spesifik olabilirseniz, gereksinimlerinizi karşılayan bir yanıt vermeniz daha kolay olacaktır ...


6
2017-07-06 03:35



Bütün cevaplarımızın yakınlaştığı yer burası +1 - colithium


Şimdiye kadar bulduğum en iyi çözüm:

public static bool isConnected()
    {
        try
        {
            string myAddress = "www.google.com";
            IPAddress[] addresslist = Dns.GetHostAddresses(myAddress);

            if (addresslist[0].ToString().Length > 6)
            {
                return true;
            }
            else
                return false;

        }
        catch
        {
            return false;
        }

    }

kullanımı:

if(isConnected())
{
    //im connected to the internet
}
else
{
    //not connected
}

6
2017-09-23 06:24



Ancak Google alan adı kaydını yenilemeyi unutursa ne olur? ;) - ColinM
Bu bir proxy arkasında çalışmıyor, GetInternetConnectedState inanıyorum - Philip Johnson


En kolay yol, web'in mevcut olduğunu bildiğiniz bir dosyayı indirip indiremeyeceğini kontrol etmektir. Google'ın ana sayfasını indirmek için aşağıdaki kodu kullanın.

WebClient Client = new WebClient ();
String Response;
Response = Client.DownloadString("http://www.google.com");

Muhtemelen bir deneyin içinde sarmalısın .... Bir bağlantı kuramadığında atılan istisnayı yakalamak için yakalamak.


3
2017-07-05 23:25



Peki ya Google başarısız olursa? nefesi kesilmek - colithium
Windows Vista, bir yanıt alıp almadığını görmek için Microsoft.com'a ping yaparak bir internet bağlantınızın olduğunu kontrol eder. Çok farklı değil: P - Sekhat
Teşekkür ederim Killersponge. Tam olarak ne düşündüğümü. Dış sunucu için bir çeşit ping olmalı. Aksi halde, internete bağlantınız olduğunu gerçekten nasıl biliyorsunuz? DNS sunucunuzun nasıl olduğunu biliyor musunuz? Her şeyin yolunda gittiğini nereden biliyorsun? En iyi cevabı aldığımı düşünmüyorum, ama aynı zamanda hak ettiğimi sanmıyorum -4. Oh iyi. Belki zaman içinde bu durum değişecek, ben de onu bırakıyorum. Hala daha iyi olduğunu düşünüyorum (çapraz platform çalışır, Mono çalışır) bir pencere API çağrısı yapmaktan daha iyidir. - Kibbee
+1, hızlı ve ez testi. Daha yüksek ayrıntı için, ayrı testlere ayırın, ancak bu, http bağlantınızın olmasını sağlamak için iyi bir hızlı testtir. Bir proxy üzerinden http bağlantısına izin vermek istiyorsanız, proxy'yi varsayılan proxy'ye ayarlayın ... - KristoferA
+1 Bu en güvenilir yoldur! Merak etme neden oy verildi! - devnull


Windows XP'de Ağ Farkındalığı

Windows Vista ve Windows 7'de Ağ Farkındalığı

Tabii ki bu, ziyaret etmeyi planladığınız web sitesinin kooperatif güvenlik duvarı kuralları tarafından engellenmediğini garanti etmez. API, önceden tanımlanmış bir web sitesine erişilip erişilmediğini kontrol eder.


2
2017-07-06 02:50





Başka bazı seçenekler de var.

InfoPath kütüphanesi "IsDestinationReachable" Aynı adda Win API yöntemi için bir sarıcı olan yöntem. (Vista'nın desteklemediği anlaşılıyor)

Ancak, Dokümanlar'dan PING gibi bir şeye bağlı olduğuna inanıyorum, bu yüzden mutlaka iyi bir test değil.

Vista + kullanmayın "Ağ Listesi Yöneticisi"

@colithium Google aşağı olmayabilir, ancak DNS lokup aralığı zaman aşımını aşarsa işler de başarısız olabilir. NZ'de evde nadir olmayan, ilk denemeyi başarısız, ikinci başarılı, çünkü veri ikinci istekte bulunulduğunda ISP DNS veya yönlendirici önbelleğine geri döndü.


0
2018-01-31 09:55





Alternatif olarak internet bağlantısını kontrol etmek için DNS aramasını kullanabilirsiniz. Bu yöntem, Ping yönteminden daha hızlıdır.

public static bool DnsTest()
    {
        try
        {
            System.Net.IPHostEntry ipHe =
                System.Net.Dns.GetHostByName("www.google.com");
            return true;
        }
        catch
        {
            return false;
        }
    }

0