2010-03-26 14 views
27

मेरे पास एक सी # कोड है जो मूल रूप से एफ़टीपी प्रोटोकॉल के माध्यम से एक फ़ाइल अपलोड करता है (FtpWebRequest का उपयोग करके)। हालांकि, मैं पहले यह निर्धारित करना चाहता हूं कि फाइल अपलोड करने से पहले एक कामकाजी इंटरनेट कनेक्शन है (क्योंकि, यदि कोशिश करने में कोई बात नहीं है, तो सॉफ्टवेयर को सिर्फ एक समय के लिए सोना चाहिए और फिर से जांचना चाहिए) ।सी # में काम कर रहे इंटरनेट कनेक्शन का पता लगाने के लिए कैसे?

क्या ऐसा करने का कोई आसान तरीका है या क्या मुझे फ़ाइल अपलोड करने का प्रयास करना चाहिए और यदि यह विफल हुआ तो बस फिर से प्रयास करें, मान लें कि नेटवर्क कनेक्शन नीचे था?

+1

सभी को नमस्कार! सबसे पहले, आपके सभी उत्तरों के लिए धन्यवाद! मैं जारेरपार के लालित्य के जवाब के साथ जाऊंगा। @ डेमियन: मुझे पता है कि कई चीजें हो सकती हैं, मैं बस एक सरल करना चाहता हूं: क्या नेट कनेक्शन है? नहीं? 30 मिनट में वापस रहो। हाँ? ठीक है, चलिए अपलोड करने का प्रयास करें। दृष्टिकोण। जेरेडपार के कोड के साथ यह मुश्किल नहीं होना चाहिए। कुछ और अधिक परिष्कृत नहीं। फिर भी उत्तर के लिए धन्यवाद। @kzen: पिंगिंग वास्तव में एक अच्छा जवाब नहीं है। मैं, एक के लिए, मेरी कंपनी में आईसीएमपी अनुरोध अवरुद्ध हो गया है, इसलिए यह जांचना कि कामकाजी कनेक्शन के साथ भी असफल हो जाएगा। फिर भी धन्यवाद! – Detariael

+0

एंडी शैलम: आपका जवाब मूल रूप से जेरेडपार के समान है, मैंने इसे केवल इसलिए नहीं चुना है क्योंकि मुझे जेरेडपार और अधिक सुरुचिपूर्ण लग रहा है। वैसे भी आपके जवाब के लिए धन्यवाद! – Detariael

+0

ज़ीयो द्वारा एक्सेप्टेड एन्वेयर को एक में स्विच किया गया, क्योंकि इसमें लूपबैक/सुरंग शामिल हैं। – Detariael

उत्तर

31

बस सादे समारोह का उपयोग

+०१२३५१६४१०६१
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 

जो कनेक्शन चालू होने पर गलत होने पर सत्य लौटता है।

From MSDN: यदि किसी नेटवर्क इंटरफ़ेस को "अप" चिह्नित किया गया है और लूपबैक या सुरंग इंटरफ़ेस नहीं है तो नेटवर्क कनेक्शन उपलब्ध माना जाता है।

ध्यान रखें कि कनेक्टिविटी सभी नहीं है, आप स्थानीय नेटवर्क से कनेक्ट हो सकते हैं और उदाहरण के लिए राउटर इंटरनेट से कनेक्ट नहीं है। वास्तव में यह जानने के लिए कि क्या आप इंटरनेट से कनेक्ट हैं, Ping कक्षा का प्रयास करें।

+0

केबल को डिस्कनेक्ट करते समय, उपर्युक्त विधि सत्य लौटाती है। – mmmmmm

+0

क्या यह वायरलेस कनेक्शन सीमित होने पर भी काम करता है? –

+0

@mmmmmm केबल को डिस्कनेक्ट करने का मतलब यह नहीं है कि सभी नेटवर्क अनुपलब्ध हैं। उदाहरण के लिए आप वाईफ़ाई पर हो सकते हैं। – Zyo

12

मुझे लगता है कि सबसे अच्छा सन्निकटन आप उपयोग कर सकते NetworkInterface प्रकार पर OperationalStatus मूल्य की जाँच करने के लिए है।

using System.Net.NetworkInformation; 

public bool IsNetworkLikelyAvailable() { 
    return NetworkInterface 
    .GetAllNetworkInterfaces() 
    .Any(x => x.OperationalStatus == OperationalStatus.Up); 
} 

याद रखें हालांकि यह अनुमान है। जिस क्षण यह तरीका कंप्यूटर लौटाता है, वह इंटरनेट कनेक्शन खो सकता है या प्राप्त कर सकता है। आईएमओ मैं सीधे अपलोड के लिए सीधे जाऊंगा और त्रुटि को संभालेगा क्योंकि आप साबित नहीं कर सकते कि ऐसा नहीं होगा।

+1

यह लूपबैक इंटरफ़ेस और आपके द्वारा सेट किए गए किसी भी सुरंग इंटरफेस को वापस कर सकता है। इन रिपोर्टों में से कोई भी 'अप' होने पर भी आपको शायद 'नहीं' की रिपोर्ट करनी चाहिए। मुझे पता है कि लूपबैक इंटरनेट की स्थिति के बावजूद लगभग हर समय रिपोर्ट 'अप' करता है। – colithium

+0

उस जेरेडपार के लिए धन्यवाद, आपके पास सिर्फ मेरा एप्लिकेशन डिज़ाइन है जो बहुत आसान है। – grefly

6

उस स्थिति के बारे में सोचें जहां आपकी जांच वापस आती है और कहती है "कनेक्शन वहां है" और इससे पहले कि आप अपना एफ़टीपी शुरू कर सकें, कनेक्शन गिर जाता है।

या जहां कनेक्शन आपके एफ़टीपी अनुरोध के माध्यम से भाग रास्ता छोड़ देता है।

यह देखते हुए कि आप इन स्थितियों वैसे भी के लिए जेसन की टिप्पणी के जवाब

तुम भी विपरीत हालत हो सकता है में जाँच कोड करने के लिए, बस छोड़

संपादन होते हैं - कि जब आप की जाँच एक कनेक्शन के लिए, कोई भी मौजूद नहीं है, लेकिन एक पल बाद में, उनका कनेक्शन आता है। तो अब आप क्या करते हैं - क्या आप किसी कनेक्शन की अनुपस्थिति के बारे में उपयोगकर्ता को नाराज करना शुरू करते हैं, भले ही यह अब उपलब्ध हो?

दिन के अंत में, आप बड़ी संख्या में संसाधनों (आपके नेट कनेक्शन, किसी भी मध्यवर्ती राउटर, मेजबान, इसकी एफ़टीपी सेवा) से निपट रहे हैं। ये सभी आपके नियंत्रण के बाहर परिवर्तन के अधीन हैं (जैसा कि सेठ की टिप्पणी दर्शाती है), और प्री-टेस्टिंग की कोई भी राशि प्रश्न का उत्तर नहीं देगी "क्या मैं इस अपलोड को पूरा करने में सक्षम हूं"?

चूंकि ओपी ने संकेत दिया कि वह "बैक ऑफ और बाद में पुनः प्रयास करें" दृष्टिकोण के बारे में सोच रहा है, तो मुझे लगता है कि पृष्ठभूमि में यह सब करना उचित है और उपयोगकर्ता को परेशान न करें - जब तक कि आप कोशिश नहीं कर रहे हैं बिना किसी सफलता के "अनुचित" राशि के लिए।

+0

+1 एक काम करने वाला 'नेट कनेक्शन यह इंगित नहीं करता है कि रिमोट होस्ट चालू है और उसके पास एक काम कर रहे FTP सर्वर भी है। – Seth

+5

अच्छा जवाब, लेकिन मुझे लगता है कि आप इसे वापस देख रहे हैं: यदि आपके पास कनेक्शन नहीं है, तो आपके प्रोग्राम को किसी भी संचार को शुरू करने की कोशिश नहीं करनी चाहिए - आप इसे टाइमआउट में लॉक कर सकते हैं और/या सीपीयू को बर्बाद कर सकते हैं एक मृत लिंक पर बात करने और/या उपयोगकर्ता को सैकड़ों बेवकूफ त्रुटियों की रिपोर्ट करने के लिए निष्पक्ष प्रयासों पर समय। अच्छे कार्यक्रम खुशी से पता लगाएंगे कि लिंक ऑफलाइन है और इसका उपयोग करने की कोशिश करना बंद कर देता है। –

6

क्या आप फ़ाइल अपलोड करने से पहले FTP सर्वर को पिंग करने के लिए System.Net.NetworkInformation Namespace के Ping Class का उपयोग नहीं कर सकते हैं?

+2

अगर रिमोट होस्ट पिंग अनुरोधों को ब्लॉक करता है तो यह विफल हो जाएगा - जो कि अच्छा अभ्यास है और कुछ बड़े होस्टिंग प्रदाता करते हैं। –

+0

हां, मैंने सोचा था कि यह स्पष्ट था इसलिए मैंने इसका उल्लेख करने से कोई परेशानी नहीं की ... जैसा कि अन्य लोगों ने पहले ही देखा है कि बिल्कुल यह सुनिश्चित करने का कोई तरीका नहीं है कि कनेक्शन किसी भी के साथ एफ़टीपी अनुरोध के सही समय पर उपलब्ध होगा तरह की जांच, लेकिन मुझे लगता है कि एक पिंग एक अच्छा पर्याप्त अनुमान है और लागू करने के लिए एक बहुत ही सरल है। –

14

एक "नेटवर्क उपलब्धता बदल गई" घटना है जो आग लगती है जब एक नेटवर्क कनेक्शन की "अप" स्थिति एक इंटरफ़ेस पर बदलती है जो सुरंग या लूपबैक नहीं है।

आप स्टार्टअप पर सिस्टम पर सभी नेटवर्क एडाप्टर की स्थिति पढ़ सकते हैं, "नेटवर्क उपलब्ध है" का वर्तमान मूल्य स्टोर करें, फिर इस घटना को सुनें और इस घटना को आग लगने पर अपने नेटवर्क स्टेट वैरिएबल को बदलें। ऐसा लगता है कि यह डायल-अप और आईएसडीएन कनेक्शन भी संभाल लेगा।

माना जाता है कि एनआईसी राउटर से जुड़ा हुआ है (और काम कर रहा है) लेकिन राउटर पर इंटरनेट कनेक्शन डाउन है, या रिमोट होस्ट प्रतिक्रिया नहीं दे रहा है, लेकिन यह कम से कम होगा यदि आप कोई नेटवर्क कनेक्शन शुरू करने के लिए काम नहीं कर रहे हैं, तो ऐसा करने का प्रयास करने से रोकें (उदाहरण के लिए वीपीएन या आईएसडीएन लिंक डाउन है।)

यह एक सी # कंसोल एप्लिकेशन है - इसे चालू करना शुरू करें, फिर अक्षम करें या अपने नेटवर्क कनेक्शन अनप्लग :-)

class Program 
{ 
    static bool networkIsAvailable = false; 

    static void Main(string[] args) 
    { 
     NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); 

     foreach (NetworkInterface nic in nics) 
     { 
      if (
       (nic.NetworkInterfaceType != NetworkInterfaceType.Loopback && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && 
       nic.OperationalStatus == OperationalStatus.Up) 
      { 
       networkIsAvailable = true; 
      } 
     } 

     Console.Write("Network availability: "); 
     Console.WriteLine(networkIsAvailable); 

     NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged); 

     Console.ReadLine(); 
    } 

    static void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) 
    { 
     networkIsAvailable = e.IsAvailable; 

     Console.Write("Network availability: "); 
     Console.WriteLine(networkIsAvailable); 
    } 
} 
+1

+1 यह समझने के लिए कि लूपबैक और सुरंग कनेक्शन का प्रतिनिधित्व नहीं करते हैं। इच्छा है कि मैं स्वीकार किए गए उत्तर को लागू करने की कोशिश करने से पहले अपना जवाब पढ़ूंगा ... – colithium

5

यदि आपके लिए पिंग मुश्किल है, तो बस वेब क्लाइंट का उपयोग करें।

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

या कोई अन्य साइट। संपादित करें: आप इस साइट पर http://www.msftncsi.com/ का उपयोग कर सकते हैं। यह वह साइट है जो केवल इंटरनेट कनेक्टिविटी के लिए चलती है। कैसे विंडोज 7 इंटरनेट कनेक्टिविटी http://blog.superuser.com/2011/05/16/windows-7-network-awareness/

1

सिर्फ लिखा async कार्यों पाता है की विस्तृत रजिस्ट्री व्याख्या यह है कि ऐसा करने के लिए देखें:

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 
     { 
     } 
    } 
संबंधित मुद्दे