दिलचस्प पोस्ट
समयपूर्व अनुकूलन के लिए व्यावहारिक नियम यह कोड सी # में अमान्य क्यों है? एस 3 REST एपीआई और पोस्ट विधि AngularJS में निर्देश लिखते समय, मैं कैसे तय करूं कि मुझे कोई नया अवसर, एक नया बच्चा गुंजाइश या एक नया पृथक क्षेत्र की आवश्यकता नहीं है? डेटा एसएमएस संदेश भेजने और प्राप्त करने के तरीके मौजूदा स्टाइलशीट के साथ ऐप के लिए सीएसएस ढांचा इकाई फ़्रेमवर्क / SQL के लिए SQL: छोड़ें और ले जाएं मैं आंतरिक सामग्री से फाइल सामग्री कैसे पढ़ूं – एंड्रॉइड ऐप क्या संकेतक का आकार डेटा और फ़ंक्शन पॉइंटर्स के बीच भिन्न हो सकता है? Google मानचित्र रिलीज एपीआई कुंजी उत्पन्न करना क्रोम एक्सटेंशन सामग्री स्क्रिप्ट में, मुझे दस्तावेज़ की प्रतीक्षा करनी चाहिए। दस्तावेज को प्रोसेस करने से पहले ही? getApplicationContext (), getBaseContext (), getApplication (), getParent () मैं अपने कार्यक्रम की स्थिति कैसे बचा सकता हूं और फिर उसे लोड कर सकता हूं? जावास्क्रिप्ट कैप्चर ब्राउज़र शॉर्टकट (ctrl + t / n / w) अपने बाउंड अपवादित व्यवहार से बाहर एक वैश्विक सरणी तक पहुंच रहा है?

नेट कनेक्टिविटी का उपयोग करने के लिए सबसे अच्छा तरीका क्या है?

इंटरनेट कनेक्टिविटी के लिए एनएटी में सबसे तेज़ और सबसे प्रभावी तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "नेट कनेक्टिविटी का उपयोग करने के लिए सबसे अच्छा तरीका क्या है?"

ऐसा कुछ काम करना चाहिए

System.Net.WebClient

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

वहाँ बिल्कुल कोई रास्ता नहीं है आप मज़बूती से जांच सकते हैं कि क्या कोई इंटरनेट कनेक्शन है या नहीं (मुझे लगता है कि आप इंटरनेट का उपयोग मतलब है)।

हालांकि, आप संसाधनों का अनुरोध कर सकते हैं जो वास्तव में कभी ऑफ़लाइन नहीं हैं, जैसे कि pinging google.com या कुछ इसी तरह की। मुझे लगता है कि यह कुशल होगा

 try { 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); return (reply.Status == IPStatus.Success); } catch (Exception) { return false; } 

जाँच करने के बजाय, बस क्रिया (वेब ​​अनुरोध, मेल, एफटीपी, आदि) को पूरा करें और असफल रहने के अनुरोध के लिए तैयार रहें, जो आपको वैसे भी करना है, भले ही आपका चेक सफल रहा हो।

निम्नलिखित को धयान मे रखते हुए:

 1 - check, and it is OK 2 - start to perform action 3 - network goes down 4 - action fails 5 - lot of good your check did 

यदि नेटवर्क डाउन है तो आपकी कार्रवाई एक पिंग, आदि के रूप में तेज़ी से विफल हो जाएगी।

 1 - start to perform action 2 - if the net is down(or goes down) the action will fail 

NetworkInterface.GetIsNetworkAvailable बहुत अविश्वसनीय है बस कुछ VMware या अन्य LAN कनेक्शन है और यह गलत परिणाम वापस करेगा। इसके अलावा Dns.GetHostEntry पद्धति के बारे में मैं बस इस बात से चिंतित था कि क्या परीक्षण यूआरएल को पर्यावरण में अवरुद्ध किया जा सकता है, जहां मेरा आवेदन तैनात किया जा रहा है।

तो मुझे पता चला एक और तरीका InternetGetConnectedState विधि का उपयोग कर रहा है मेरा कोड है

 [System.Runtime.InteropServices.DllImport("wininet.dll")] private extern static bool InternetGetConnectedState(out int Description, int ReservedValue); public static bool CheckNet() { int desc; return InternetGetConnectedState(out desc, 0); } 

Google को पिंग करके इंटरनेट कनेक्शन के लिए एक परीक्षण:

 new Ping().Send("www.google.com.mx").Status == IPStatus.Success 

मैं उन लोगों के साथ असहमत हूं जो बता रहे हैं: "कार्य करने से पहले कनेक्टिविटी की जाँच करने के लिए, जांच के तुरंत बाद कनेक्शन खो दिया जा सकता है"। निश्चित रूप से डेवलपर्स के रूप में हम कई प्रोग्रामिंग कार्यों में अनिश्चितता की डिग्री लेते हैं, लेकिन अनिश्चितता को स्वीकृति के स्तर तक कम करना चुनौती का हिस्सा है।

मैं हाल ही में इस समस्या में एक आवेदन कर रहा था जिसमें एक मैपिंग फीचर शामिल था जो एक ऑन लाइन टाइल सर्वर से जुड़ा था। इस कार्यशीलता को अक्षम किया जाना था जहां इंटरनेट कनेक्टिविटी की कमी दर्ज की गई थी।

इस पृष्ठ पर कुछ प्रतिक्रियाएं बहुत अच्छी थीं, लेकिन फिर भी फांसी के रूप में बहुत सारे प्रदर्शन समस्याएं उत्पन्न हुईं, मुख्य रूप से कनेक्टिविटी की अनुपस्थिति के मामले में।

इनमें से कुछ उत्तर और मेरे सहयोगियों की सहायता से, इसका समाधान मेरे द्वारा समाप्त हो गया है:

  // Insert this where check is required, in my case program start ThreadPool.QueueUserWorkItem(CheckInternetConnectivity); } void CheckInternetConnectivity(object state) { if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { using (WebClient webClient = new WebClient()) { webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache); webClient.Proxy = null; webClient.OpenReadCompleted += webClient_OpenReadCompleted; webClient.OpenReadAsync(new Uri("<url of choice here>")); } } } volatile bool internetAvailable = false; // boolean used elsewhere in code void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { if (e.Error == null) { internetAvailable = true; Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() => { // UI changes made here })); } } 

अपने कोड की जाँच और चलाने के बीच जा रहे नेटवर्क की समस्या को हल नहीं करता है, लेकिन यह काफी विश्वसनीय है

 public static bool IsAvailableNetworkActive() { // only recognizes changes related to Internet adapters if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) { // however, this will include all adapters -- filter by opstatus and activity NetworkInterface[] interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(); return (from face in interfaces where face.OperationalStatus == OperationalStatus.Up where (face.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && (face.NetworkInterfaceType != NetworkInterfaceType.Loopback) select face.GetIPv4Statistics()).Any(statistics => (statistics.BytesReceived > 0) && (statistics.BytesSent > 0)); } return false; } 
 private bool ping() { System.Net.NetworkInformation.Ping pingSender = new System.Net.NetworkInformation.Ping(); System.Net.NetworkInformation.PingReply reply = pingSender.Send(address); if (reply.Status == System.Net.NetworkInformation.IPStatus.Success) { return true; } else { return false; } } 

पिंगिंग google.com एक DNS रिज़ॉल्यूशन निर्भरता का परिचय देता है पिंग 8.8.8.8 ठीक है लेकिन Google मेरे पास कई हॉप्स से दूर है मुझे जो कुछ करना है, वह मुझे निकटतम चीज़ को इंटरनेट पर पिंग करना है

मैं पिंग की टीटीएल सुविधा का उपयोग पिंग हॉप # 1, तो हॉप # 2 आदि के लिए कर सकता हूं, जब तक कि मुझे किसी ऐसे रिप्लेसमेंट एड्रेस पर कोई जवाब नहीं मिलता; अगर वह नोड एक योग्य पते पर है तो यह इंटरनेट पर है हममें से ज्यादातर, हॉप # 1 हमारे स्थानीय गेटवे / राउटर होंगे, और हॉप # 2 हमारे फाइबर कनेक्शन की दूसरी तरफ या जो कुछ भी होगा

यह कोड मेरे लिए काम करता है, और इस धागे में कुछ अन्य सुझावों की तुलना में तेज़ी से प्रतिक्रिया करता है क्योंकि यह इंटरनेट पर सबसे नज़दीकी जो भी है वह पिंग कर रहा है।

 using System.Net; using System.Net.Sockets; using System.Net.NetworkInformation; using System.Diagnostics; internal static bool ConnectedToInternet() { const int maxHops = 30; const string someFarAwayIpAddress = "8.8.8.8"; // Keep pinging further along the line from here to google // until we find a response that is from a routable address for (int ttl = 1; ttl <= maxHops; ttl++) { Ping pinger = new Ping(); PingOptions options = new PingOptions(ttl, true); byte[] buffer = new byte[32]; PingReply reply = null; try { reply = pinger.Send(someFarAwayIpAddress, 10000, buffer, options); } catch (System.Net.NetworkInformation.PingException pingex) { Debug.Print("Ping exception (probably due to no network connection or recent change in network conditions), hence not connected to internet. Message: " + pingex.Message); return false; } System.Diagnostics.Debug.Print("Hop #" + ttl.ToString() + " is " + (reply.Address == null ? "null" : reply.Address.ToString()) + ", " + reply.Status.ToString()); if (reply.Status != IPStatus.TtlExpired && reply.Status != IPStatus.Success) { Debug.Print("Hop #" + ttl.ToString() + " is " + reply.Status.ToString() + ", hence we are not connected."); return false; } if (IsRoutableAddress(reply.Address)) { System.Diagnostics.Debug.Print("That's routable so you must be connected to the internet."); return true; } } return false; } private static bool IsRoutableAddress(IPAddress addr) { if (addr == null) { return false; } else if (addr.AddressFamily == AddressFamily.InterNetworkV6) { return !addr.IsIPv6LinkLocal && !addr.IsIPv6SiteLocal; } else // IPv4 { byte[] bytes = addr.GetAddressBytes(); if (bytes[0] == 10) { // Class A network return false; } else if (bytes[0] == 172 && bytes[1] >= 16 && bytes[1] <= 31) { // Class B network return false; } else if (bytes[0] == 192 && bytes[1] == 168) { // Class C network return false; } else { // None of the above, so must be routable return true; } } } 

मैंने ऊपर सूचीबद्ध सभी विकल्पों को देखा है और एकमात्र व्यवहार्य विकल्प जो कि इंटरनेट उपलब्ध है या नहीं है "पिंग" विकल्प है। [DllImport("Wininet.dll")] और System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces() या NetworkInterface वर्ग के किसी अन्य भिन्नता को नेटवर्क की उपलब्धता का पता लगाने में अच्छी तरह से काम नहीं करता। ये तरीके केवल NetworkInterface कि नेटवर्क केबल प्लग हो गया है या नहीं

"पिंग विकल्प"

if (कनेक्शन उपलब्ध है) रिटर्न true

if (कनेक्शन उपलब्ध नहीं है और नेटवर्क केबल प्लग इन है) तो false रिटर्न देता false

if (नेटवर्क केबल प्लग नहीं है) Throws an exception

नेटवर्क इंटरफेस

if (इंटरनेट उपलब्ध है) रिटर्न True

if (इंटरनेट उपलब्ध नहीं है और नेटवर्क केबल प्लग इन किया गया है) True

if (नेटवर्क केबल में प्लग नहीं किया गया है) false वापसी करता false

[DllImport ("Wininet.dll")]

if (इंटरनेट उपलब्ध है) रिटर्न True

if (इंटरनेट उपलब्ध नहीं है और नेटवर्क केबल प्लग इन किया गया है) True

if (नेटवर्क केबल में प्लग नहीं किया गया है) false वापसी करता false

इसलिए [DllImport("Wininet.dll")] और NetworkInterface में जानने का कोई तरीका नहीं है कि इंटरनेट कनेक्शन उपलब्ध है।

यहां बताया गया है कि इसे एंड्रॉइड में कैसे कार्यान्वित किया गया है।

अवधारणा के प्रमाण के रूप में, मैंने इस कोड को सी # में अनुवाद किया है:

 var request = (HttpWebRequest)WebRequest.Create("http://g.cn/generate_204"); request.UserAgent = "Android"; request.KeepAlive = false; request.Timeout = 1500; using (var response = (HttpWebResponse)request.GetResponse()) { if (response.ContentLength == 0 && response.StatusCode == HttpStatusCode.NoContent) { //Connection to internet available } else { //Connection to internet not available } } 

मेरे आवेदन के लिए हम डाउनलोड छोटे फ़ाइल द्वारा भी परीक्षण करते हैं।

 string remoteUri = "https://www.microsoft.com/favicon.ico" WebClient myWebClient = new WebClient(); try { byte[] myDataBuffer = myWebClient.DownloadData (remoteUri); if(myDataBuffer.length > 0) // Or add more validate. eg. checksum { return true; } } catch { return false; } 

इसके अलावा। कुछ आईएसपी मध्य सर्वर को कैश फ़ाइल में इस्तेमाल कर सकता है। यादृच्छिक अप्रयुक्त पैरामीटर उदाहरण के लिए जोड़ें। https://www.microsoft.com/favicon.ico?req=random_number कैशिंग रोका जा सकता है।

मुझे अपने 3 जी राउटर / मॉडेम पर उन तरीकों पर समस्या हो रही है, क्योंकि यदि इंटरनेट का डिस्कनेक्ट किया गया है, तो रूटर पृष्ठ को अपने प्रतिसाद पृष्ठ पर रीडायरेक्ट करता है, इसलिए आपको अभी भी स्टीम मिलता है और आपका कोड लगता है कि इंटरनेट है एपल्स (या अन्य) के पास हॉट स्पॉट डिटेक्शन पेज है जो हमेशा एक निश्चित प्रतिक्रिया देता है। निम्नलिखित नमूना "सफलता" प्रतिक्रिया देता है तो आप वास्तव में सुनिश्चित होंगे कि आप इंटरनेट से जुड़ सकते हैं और वास्तविक प्रतिक्रिया प्राप्त कर सकते हैं!

 public static bool CheckForInternetConnection() { try { using (var webClient = new WebClient()) using (var stream = webClient.OpenRead("http://captive.apple.com/hotspot-detect.html")) { if (stream != null) { //return true; stream.ReadTimeout = 1000; using (var reader = new StreamReader(stream, Encoding.UTF8, false)) { string line; while ((line = reader.ReadLine()) != null) { if (line == "<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>") { return true; } Console.WriteLine(line); } } } return false; } } catch { } return false; } 

एक और विकल्प नेटवर्क सूची प्रबंधक एपीआई है जो Vista और विंडोज 7 के लिए उपलब्ध है । यहां एमएसडीएन लेख। लेख में कोड नमूने डाउनलोड करने के लिए एक लिंक है जो आपको ऐसा करने की अनुमति देता है:

 AppNetworkListUser nlmUser = new AppNetworkListUser(); Console.WriteLine("Is the machine connected to internet? " + nlmUser.NLM.IsConnectedToInternet.ToString()); 

नेटवर्क सूची 1.0 के संदर्भ को जोड़ने के लिए सुनिश्चित करें COM टैब से पुस्तकालय टाइप करें … जो कि नेटवर्क्स LIST के रूप में दिखाई देगा।

यदि आप उपयोगकर्ता को सूचित करना चाहते हैं / जब भी कोई नेटवर्क / कनेक्शन बदलते हैं तो कार्रवाई करें
एनएलएम एपीआई का प्रयोग करें:

मैं व्यक्तिगत रूप से एंटोन और मोफ़ेल्त्जे का सबसे अच्छा जवाब ढूंढता हूं, लेकिन मैंने वीएमवेयर और अन्य लोगों द्वारा स्थापित वर्चुअल नेटवर्क को बाहर करने के लिए एक चेक जोड़ा।

 public static bool IsAvailableNetworkActive() { // only recognizes changes related to Internet adapters if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) return false; // however, this will include all adapters -- filter by opstatus and activity NetworkInterface[] interfaces = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(); return (from face in interfaces where face.OperationalStatus == OperationalStatus.Up where (face.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && (face.NetworkInterfaceType != NetworkInterfaceType.Loopback) where (!(face.Name.ToLower().Contains("virtual") || face.Description.ToLower().Contains("virtual"))) select face.GetIPv4Statistics()).Any(statistics => (statistics.BytesReceived > 0) && (statistics.BytesSent > 0)); } 

मुझे नहीं लगता कि यह असंभव है, बस सीधा नहीं है

मैंने इस तरह से कुछ बनाया है, और हाँ यह सही नहीं है, लेकिन पहला कदम जरूरी है: जांचने के लिए कि क्या कोई भी नेटवर्क कनेक्टिविटी है विंडोज एपीआई एक अच्छा काम नहीं करता है, तो क्यों नहीं एक बेहतर काम करते हैं?

 bool NetworkIsAvailable() { var all = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(); foreach (var item in all) { if (item.NetworkInterfaceType == NetworkInterfaceType.Loopback) continue; if (item.Name.ToLower().Contains("virtual") || item.Description.ToLower().Contains("virtual")) continue; //Exclude virtual networks set up by VMWare and others if (item.OperationalStatus == OperationalStatus.Up) { return true; } } return false; } 

यह बहुत आसान है, लेकिन यह वास्तव में जांच की गुणवत्ता को बेहतर बनाने में मदद करता है, खासकर जब आप विभिन्न प्रॉक्सी कॉन्फ़िगरेशन देखना चाहते हैं

इसलिए:

  • जांचें कि क्या वहाँ नेटवर्क कनेक्टिविटी है (यह वाकई अच्छी तरह से बना है, संभवतः नेटवर्क डेवलपर्स के पास लॉग भी भेजे गए हैं, जब नेटवर्कआईस उपलब्ध फ़ंक्शन में सुधार करने के लिए झूठी सकारात्मक हैं)
  • HTTP पिंग
  • (प्रत्येक पर HTTP पिंग्स के साथ प्रॉक्सी कॉन्फ़िगरेशन के माध्यम से साइकिल)
 public static bool Isconnected = false; public static bool CheckForInternetConnection() { try { 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) { return true; } else if (reply.Status == IPStatus.TimedOut) { return Isconnected; } else { return false; } } catch (Exception) { return false; } } public static void CheckConnection() { if (CheckForInternetConnection()) { Isconnected = true; } else { Isconnected = false; } } 
 public static bool HasConnection() { try { System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com"); return true; } catch { return false; } } 

यह काम करता है

मेरे पास इंटरनेट कनेक्शन के लिए तीन परीक्षण हैं।

  • संदर्भ System.Net और System.Net.Sockets
  • निम्नलिखित परीक्षण कार्य जोड़ें:

टेस्ट 1

 public bool IsOnlineTest1() { try { IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com"); return true; } catch (SocketException ex) { return false; } } 

टेस्ट 2

 public bool IsOnlineTest2() { try { IPHostEntry dummy = Dns.GetHostEntry("https://www.google.com"); return true; } catch (SocketException ex) { return false; } } 

टेस्ट 3

 public bool IsOnlineTest3() { System.Net.WebRequest req = System.Net.WebRequest.Create("https://www.google.com"); System.Net.WebResponse resp = default(System.Net.WebResponse); try { resp = req.GetResponse(); resp.Close(); req = null; return true; } catch (Exception ex) { req = null; return false; } } 

परीक्षण करना

यदि आप String और Boolean का एक Dictionary बनाते हैं तो आप CheckList को प्रत्येक परीक्षण के परिणाम जोड़ सकते हैं।

अब, प्रत्येक KeyValuePair व्हॉल्यूपेयर के माध्यम से एक के for...each लूप का उपयोग करें।

यदि CheckList में true Value true , तो आपको पता है कि एक इंटरनेट कनेक्शन है।

 bool bb = System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); if (bb == true) MessageBox.Show("Internet connections are available"); else MessageBox.Show("Internet connections are not available");