2009-02-03 10 views
9

मैं सी #/नेट विकास के लिए नौसिखिया हूं, लेकिन मैंने अपनी कंपनी में संपत्ति के एक छोटे से सेट के लिए एक स्टॉक ट्रैकिंग एप्लिकेशन रखा है। मैंने SQL 2000 में जो डेटाबेस कनेक्ट किया है, उसे भी सेट अप किया है।एक उपलब्ध नेटवर्क कनेक्शन सत्यापित करने का सबसे आसान तरीका क्या है?

यह नेटवर्क कनेक्शन उपलब्ध होने पर वर्तमान में शानदार काम करता है, लेकिन जब मैं कनेक्शन से दूर हूं, तो मैं इसे उपयोग के लिए विस्तारित करना चाहता हूं।

सबसे पहले मुझे यह पता होना होगा कि कोई कनेक्शन उपलब्ध है या नहीं। तो मैं इस एक साथ रखा:

private int availableNetAdapters() 
    { 
     int nicCount = 0; 
     foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()) 
     { 
      if (nic.OperationalStatus == OperationalStatus.Up) 
      { 
       nicCount++; 
      } 
     } 

     return nicCount; 
    } 

काम करने के लिए लगता है, लेकिन मैं के रूप में "एमएस टीसीपी लूपबैक इंटरफेस" के रूप में कुछ हमेशा अन्य एडाप्टर sates की परवाह किए बिना का पता चला है "> 1" के लिए परीक्षण करने के लिए है।

क्या कनेक्टिविटी की जांच करने का एक बेहतर/आसान तरीका है?

जी

उत्तर

9

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

तुम भी उस वर्ग में घटनाओं NetworkAvailabilityChanged और NetworkAddressChanged उपयोग कर सकते हैं आईपी पते और नेटवर्क की उपलब्धता परिवर्तन नजर रखने के लिए।

संपादित करें: ध्यान रखें कि यह विधि कंप्यूटर (वायरलेस, लैन इत्यादि) पर उपलब्ध सभी उपलब्ध नेटवर्क इंटरफेस की जांच करती है। यदि उनमें से कोई भी जुड़ा हुआ है, तो यह सच हो जाएगा।

+2

परिभाषित पर कब्जा करने के तरीकों अप कोड अगर मैं मुझे सही होगी मैं गलत हूं, लेकिन यह भी ब्लूटूथ नहीं होगा? यह एक अवांछनीय परिणाम प्रतीत होता है। – TheSmurf

+0

बस इसे गुगल किया, और ऐसा लगता है कि आप सही हैं। – Luke

8

कुछ और बातें याद करने के लिए:

  • avaialable नेटवर्क कनेक्शन = उपलब्ध इंटरनेट कनेक्शन।
  • इंटरनेट एक्सेस! = एक विशिष्ट वेब साइट के लिए उपयोग (लगता है प्रॉक्सी फिल्टर, या साइट बस नीचे हो सकता है)

इसलिए यह आम तौर पर विशिष्ट संसाधन आप सीधे की जरूरत के लिए उपयोग के लिए परीक्षण करने के लिए सबसे अच्छा है।

ये संसाधन अस्थिर हैं; जब भी वे नीचे जाते हैं तो आपको अपवाद को संभालना होगा। तो आम तौर पर संसाधन प्राप्त करने के लिए सबसे अच्छा है जैसे कि आप निश्चित रूप से जानते हैं कि यह अस्तित्व में है और यह सुनिश्चित करने के लिए कि आपका अपवाद हैंडलर असफलताओं के साथ अच्छा काम करता है, अपना विकास समय दें।

+0

अनुस्मारक के लिए धन्यवाद। क्या यह चुनने का सबसे अच्छा तरीका है कि मेरे प्रोग्राम को ऑफ़लाइन मोड में ट्यून करना है या नहीं? मैं इस डेटा को ऑफ़लाइन समय में ऑफ़लाइन स्टोर करने के लिए एक विधि को देखूंगा लेकिन इनमें से कुछ को काम करने के लिए wan :-) –

+0

मेरा $ 0.02 यह है कि पहली बार आपको विफलता मिलती है, अगर उपयोगकर्ता को फिर से प्रयास करना है या जाना है ऑफ़लाइन मोड में। अगर वे ऑफ़लाइन मोड में जाते हैं, तो ऑफ़लाइन मोड में तब तक रहें जब तक कि वे फिर से ऑनलाइन जाने का प्रयास करने के लिए बटन पर क्लिक न करें। – rmeador

0

हमारे पास एक ऐसा एप्लिकेशन है जो मुख्य रूप से वायरलेस एयर कार्ड के माध्यम से जुड़े पुलिस कारों में चलता है। हमें यह निर्धारित करने के लिए एक तरीका चाहिए कि वे जुड़े हुए हैं या नहीं। हमने एक बहुत छोटी Ping.cs कक्षा लिखी है जो एक नियमित अंतराल पर एक पूर्वनिर्धारित आईपी या कंप्यूटर नाम पिंग करता है। हम परिणाम संदेश की व्याख्या करते हैं और सिस्टम ट्रे कनेक्शन आइकन के प्रदर्शन को बदलते हैं। यदि आप चाहते हैं कि मैं आपको सी # कोड भेज सकता हूं।

+0

हाँ कृपया, मैं उस कोड को देखना चाहता हूं जो मेरे लिए बहुत उपयोगी लगता है –

+0

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

+0

क्या उस कंप्यूटर पर कभी भी कुछ कारणों से हटा दिया नहीं जाएगा? मुझे उम्मीद है कि आपने यह अच्छी तरह से प्रलेखित किया है कि काम करने के लिए सिस्टम के लिए होना जरूरी है। –

4

यहाँ वर्ग

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.Diagnostics; 

namespace Ping 
{  
    public readonly int iSent = 0; 
    public readonly int iReceived = 0; 
    public readonly int iLost = 0; 

    public PingReceivedArgs (int iSent, int iReceived, int iLost) 
    { 
     this.iSent = iSent; 
     this.iReceived = iReceived; 
     this.iLost = iLost; 
    } 

    public class PingFailedArgs : EventArgs 
    { 
     public readonly int iSent = 0; 
     public readonly int iReceived = 0; 
     public readonly int iLost = 0; 

     public PingFailedArgs (int iSent, int iReceived, int iLost) 
     { 
      this.iSent = iSent; 
      this.iReceived = iReceived; 
      this.iLost = iLost; 
     } 
    } 

/// <summary> 
/// The Main Ping Class 
/// </summary> 
public class Ping 
{ 
     //Create delegate for events 
      public delegate void PingReceivedHandler(object DataObj, PingReceivedArgs PingReceived); 
     public delegate void PingFailedHandler(object DataObj, PingFailedArgs PingFailed); 

    //The events we publish 
    public event PingReceivedHandler OnPingReceived; 
    public event PingFailedHandler OnPingFailed; 

    private void FirePingReceivedEvent(int iSent, int iReceived, int iLost) 
    { 
     PingReceivedArgs NewStatus = new PingReceivedArgs(iSent, iReceived, iLost); 
     if (OnPingReceived != null) 
     { 
      OnPingReceived(this,NewStatus); 
     } 
    } 

    private void FirePingFailedEvent(int iSent, int iReceived, int iLost) 
    { 
     PingFailedArgs NewStatus = new PingFailedArgs(iSent, iReceived, iLost); 
     if (OnPingFailed != null) 
     { 
      OnPingFailed(this,NewStatus); 
     } 
    } 


    private string _Host = ""; 
    private bool _HostFound = false; 
    private int _PingSent = 0; 
    private int _PingReceived = 0; 
    private int _PingLost = 0; 
    private int _PauseBetweenPings = 2000; 
    private Thread _PingThread; 

    public string Host 
    { 
     get { return _Host; } 
     set { _Host = value; } 
    } 
    public bool HostFound 
    { 
     get { return _HostFound; } 
    } 
    public int PingSent 
    { 
     get { return _PingSent; } 
    } 
    public int PingReceived 
    { 
     get { return _PingReceived; } 
    } 
    public int PingLost 
    { 
     get { return _PingLost; } 
    } 

    public int PauseBetweenPings 
    { 
     get { return _PauseBetweenPings; } 
     set { _PauseBetweenPings = value; } 
    } 

    public Ping() 
    { 
     // 
     // TODO: Add constructor logic here 
     // 
    } 

    public void StartPinging() 
    { 
     try 
     { 
      if (_Host.Length == 0) 
      { 
       //LogStatus.WriteLog("Host name is blank, stopping.","Error","StartPinging"); 
       return; 
      } 


       if (_PingThread == null || (_PingThread.ThreadState & (System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.Background)) == 0) 
      { 

       _PingThread = new Thread(new ThreadStart(LoopAndPing)); 
       _PingThread.IsBackground = true; 
       _PingThread.Start(); 
      } 
     } 
     catch(Exception ex)  
     { 
      //LogStatus.WriteErrorLog(ex,"Error","StartPinging"); 
     } 
    } 

    public void StopPinging() 
    { 
     try 
     { 
       if (_PingThread != null && (_PingThread.ThreadState & (System.Threading.ThreadState.Stopped | System.Threading.ThreadState.Aborted | System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.AbortRequested)) == 0) 
      { 
       _PingThread.Abort(); 
       _PingThread.Join(); 
      } 
     } 
     catch (Exception ex) 
     { 
      //LogStatus.WriteErrorLog(ex, "Error", "StopPinging"); 
     } 
    } 

    /// <summary> 
    /// LoopAndPing: Runs from a thread. Basically loops and gathers stats. 
    /// </summary> 
    private void LoopAndPing() 
    { 
     bool bHostFound = false; 

     try 
     { 
      while(true) 
      { 
       _PingSent++; 
       bHostFound = PingHost(_Host); 
       if (bHostFound) 
       { 
        _PingReceived++; 
        _HostFound = true; 
         FirePingReceivedEvent(_PingSent,_PingReceived,_PingLost); 
       } 
       else 
       { 
        _PingLost++; 
        _HostFound = false; 
         FirePingFailedEvent(_PingSent,_PingReceived,_PingLost); 
       } 
       Thread.Sleep(_PauseBetweenPings); 
      } 
     } 
     catch(ThreadAbortException) 
     { 
      //No need to do anything! 
     } 
     catch(Exception e) 
     { 
      //LogStatus.WriteErrorLog(e,"Error","LoopAndPing"); 
     } 
    } 

    /// <summary> 
    /// PingHost - Send one ping to the host 
    /// </summary> 
    /// <param name="host">Can be an IP or Host name.</param> 
    /// <returns></returns> 
    public bool PingHost(string szHost) 
    { 
     bool bPingWorked = false; 

     try 
     { 
      string szCommand = "ping " + szHost + " -n 1"; 
      Process p = new Process(); 
      p.StartInfo.FileName = "cmd.exe"; 
      p.StartInfo.Arguments = "/Q /A /C" + szCommand; 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.RedirectStandardOutput = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.CreateNoWindow = true; 
      p.Start(); 
      string szCommandOutput = p.StandardOutput.ReadToEnd(); 
      p.WaitForExit(); 

      if (szCommandOutput.ToUpper().IndexOf("REPLY FROM") > -1) 
      { 
       bPingWorked = true; 
      } 
     } 
     catch(ThreadAbortException) 
     { 
      //No need to do anything! 
     } 
     catch(Exception e) 
     { 
      //LogStatus.WriteErrorLog(e,"Error","PingHost"); 
     } 
     return bPingWorked; 
    } 
} 
} 

क्लाइंट से आप

PingHost = new Ping(); 
PingHost.OnPingFailed += new Ping.PingFailedHandler(PingHost_OnPingFailed); 
PingHost.OnPingReceived +=new Ping.PingReceivedHandler(PingHost_OnPingReceived); 
PingHost.Host = *IP you wish to ping*; 
PingHost.StartPinging(); 

फिर कहेंगे आप PingHost की घटनाओं से ऊपर

private void PingHost_OnPingReceived(object DataObj, PingReceivedArgs PingReceived) 
{ 
    try 
    { 
     // code to do something when a successful ping occurrs 
    } 
    catch (Exception ex) 
    { 
     // code to do something when an exception occurrs 
    } 
} 

private void PingHost_OnPingFailed(object DataObj, PingFailedArgs PingFailed) 
{ 
    try 
    { 
      // code to do something when a ping failure occurrs 
    } 
    catch (Exception ex) 
    { 
      // code to do something when an exception occurrs 
    } 
} 
+0

वाह! एक्सेलेंक्ट, बहुत बहुत धन्यवाद। मैं अगले कुछ दिनों में इसे देख लूंगा। –

संबंधित मुद्दे