सी # इंटरनेट कनेक्शन की जांच

क्या आप कृपया मुझे बता सकते हैं कि मेरे कंप्यूटर में इंटरनेट कनेक्शन होने पर जांचने का कोई तरीका है या नहीं जब मेरा सी # प्रोग्राम चल रहा है। एक साधारण उदाहरण के लिए, यदि इंटरनेट काम कर रहा है, तो मैं एक संदेश बॉक्स आउटपुट करूंगा जो कह रहा है इंटरनेट उपलब्ध है । अन्यथा मैं एक संदेश कहूंगा, इंटरनेट अनुपलब्ध है

नेटवर्क उपलब्ध है या नहीं, यह देखने के लिए लाइब्रेरी फ़ंक्शन का उपयोग किए बिना (क्योंकि यह इंटरनेट कनेक्टिविटी की जांच नहीं करता है)

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

या एक वेबपेज खोलने के बिना और यह देखने के लिए कि क्या यह डेटा वापस आ रहा है

using (WebClient client = new WebClient())
      htmlCode = client.DownloadString("http://google.com");

क्योंकि इन दोनों विधियों में से मेरी आवश्यकताओं को पूरा नहीं करता है।

0
पिंगिंग के बारे में क्या? यह एक पृष्ठ खोलने से कम खपत है।
जोड़ा लेखक elyashiv, स्रोत

6 उत्तर

थोड़ा छोटा संस्करण:

public static bool CheckForInternetConnection()
{
    try
    {
        using (var client = new WebClient())
        using (var stream = client.OpenRead("http://www.google.com"))
        {
            return true;
        }
    }
    catch
    {
        return false;
    }
}

एक और विकल्प है:

Ping myPing = new Ping();
String host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success) {
 //presumably online
}

You can find a broader discussion here

0
जोड़ा
मैं दोनों विकल्पों का संयोजन कर रहा हूँ।
जोड़ा लेखक Arbaaz, स्रोत
"Google.com" का उपयोग करने में अधिक समय लगेगा क्योंकि इसे हल करने की आवश्यकता है। इसके बजाय, सीधे आईपी का उपयोग कर पिंगिंग तेज हो जाएगा। Google सार्वजनिक DNS आईपी पते पर पिंग करना ( 8.8.8.8 या 8.8.4.4 ) मेरे लिए ठीक काम करता है।
जोड़ा लेखक Mangesh, स्रोत
हालांकि आपका कोड चीन में काम नहीं करता है।
जोड़ा लेखक Pritam, स्रोत

निम्नलिखित कोड स्निपेट पर विचार करें ...

Ping myPing = new Ping();
String host = "google.com";
byte[] buffer = new byte[32];
int timeout = 1000;
PingOptions pingOptions = new PingOptions();
PingReply reply = myPing.Send(host, timeout, buffer, pingOptions);
if (reply.Status == IPStatus.Success) 
{
 //presumably online
}

शुभ लाभ!

0
जोड़ा
उत्तर अपडेट किया गया
जोड़ा लेखक gpmurthy, स्रोत
यहां अन्य प्रतिक्रियाओं के विपरीत एक कोशिश ब्लॉक में लपेटने की आवश्यकता है। Ping.Send() कई अपवादों को फेंक सकता है जिनमें DNS लुकअप विफलता शामिल हो सकती है।
जोड़ा लेखक Barton, स्रोत

ऐसा करने के लिए बस एसिंक फ़ंक्शन लिखा है:

private void myPingCompletedCallback(object sender, PingCompletedEventArgs e)
{
    if (e.Cancelled)
        return;

    if (e.Error != null)
        return;

    if (e.Reply.Status == IPStatus.Success)
    {
        //ok connected to internet, do something...
    }
}

private void checkInternet()
{
    Ping myPing = new Ping();
    myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback);
    try
    {
        myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true));
    }
    catch
    {
    }
}
0
जोड़ा
+1 विशेष रूप से यहां अन्य प्रतिक्रियाओं के विपरीत एक कोशिश ब्लॉक में लपेटने के लिए। Ping.Send() कई अपवादों को फेंक सकता है जिनमें DNS लुकअप विफलता शामिल हो सकती है।
जोड़ा लेखक Barton, स्रोत

मेरा नेटवर्क मॉनिटर क्लास अब यह प्रदान करता है (यहां अन्य प्रतिक्रियाओं के आधार पर):

    public bool IsInternetAvailable
    {
        get { return IsNetworkAvailable && _CanPingGoogle(); }
    }

    private static bool _CanPingGoogle()
    {
        const int timeout = 1000;
        const string host = "google.com";

        var ping = new Ping();
        var buffer = new byte[32];
        var pingOptions = new PingOptions();

        try {
            var reply = ping.Send(host, timeout, buffer, pingOptions);
            return (reply != null && reply.Status == IPStatus.Success);
        }
        catch (Exception) {
            return false;
        }
    }
0
जोड़ा

यह मेरा दृष्टिकोण है;

  1. Check that a network connection is available, if it isn't then we wont be able to connect to another host.
  2. Check if we can connect to some major hosts. Use a fallback just in case that site isn't available.

    public static bool ConnectToInternet(int timeout_per_host_millis = 1000, string[] hosts_to_ping = null)
    {
        bool network_available = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
    
        if (network_available)
        {
            string[] hosts = hosts_to_ping ?? new string[] { "www.google.com", "www.facebook.com" };
    
            Ping p = new Ping();
    
            foreach (string host in hosts)
            {
                try
                {
                    PingReply r = p.Send(host, timeout_per_host_millis);
    
                    if (r.Status == IPStatus.Success)
                        return true;
                }
                catch { }
            }
        }
    
        return false;
    }
    

टिप्पणियाँ:

  1. पहुंचने पर बहुत से मेजबानों का उपयोग न करें, सफलता के कम होने की संभावना के खिलाफ सभी पिंग्स बनाने के समय लागत का वजन करें।
  2. अगर हम किसी निश्चित पिंग को पिंग भेजते हैं जिसे हम बाद में कनेक्ट करना चाहते हैं (उदाहरण के लिए एक http अनुरोध) एक लौटा हुआ पिंग का मतलब यह नहीं है कि हम उस विशेष होस्ट से जुड़े हुए हैं। विचार करें कि मेजबान अवरुद्ध होने पर क्या होगा। उदाहरण के लिए ईरान, चीन में फेसबुक अवरुद्ध है ... क्या आईएसपी पिंग लौटाता है?
  3. एक DNS अनुरोध पर्याप्त नहीं होगा क्योंकि इसे कैश किया जा सकता है
0
जोड़ा
public static bool HasConnection()
{
    try
    {
        System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
        return true;
    }
    catch
    {
        return false;
    }
}
0
जोड़ा
यह वास्तव में झूठी सकारात्मक दे सकता है; कंप्यूटर के DNS सर्वर में पहले से ही 'www.google.com' कैश हो सकता है, फिर भी इसका कोई इंटरनेट कनेक्शन नहीं है। या; कंप्यूटर की DNS क्लाइंट सेवा में यह कैश भी हो सकता है।
जोड़ा लेखक Andrew Barber, स्रोत