validation可用网络连接的最简单方法是什么?

我对c#/ .net开发有点新手,但我已经为我公司的一小部分资产整理了一个股票跟踪应用程序。 我还设置了它在SQL 2000中连接的数据库。

当网络连接可用时,它目前工作得非常出色,但是当我远离连接时,我想扩展它以供使用。

首先,我需要知道是否有可用的连接。 所以我把它放在一起:

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

似乎工作,但我必须测试“> 1”,因为无论其他适配器状态如何,始终检测到“MS TCP Loopback接口”。

是否有更好/更简单的方法来检查连接?

G

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

您还可以使用该类中的事件NetworkAvailabilityChangedNetworkAddressChanged来监视IP地址和网络可用性更改。

编辑:请注意,此方法会检查计算机上可能存在的所有可用网络接口(无线,LAN等)。 如果他们中的任何人连接,它将返回true。

还有一些要记住的事情:

  • Avaialable网络连接!=可用的互联网连接。
  • Internet Access!=访问特定网站(想想代理filter,或者网站可能只是关闭)

因此,通常最好直接测试对所需特定资源的访问。

这些资源不稳定; 无论如何,你必须处理exception。 因此,通常最好只获得一个资源,就好像你确定它存在并将开发时间放在一起,以确保你的exception处理程序能够很好地处理失败。

这是class级

 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; } } ///  /// The Main Ping Class ///  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"); } } ///  /// LoopAndPing: Runs from a thread. Basically loops and gathers stats. ///  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"); } } ///  /// PingHost - Send one ping to the host ///  /// Can be an IP or Host name. ///  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 } } 

我们的应用主要在通过无线空中卡连接的警车上运行。 我们需要一种方法来确定它们是否已连接。 我们编写了一个非常小的Ping.cs类,它定期对预定的IP或计算机名称进行ping操作。 我们解释结果消息并更改系统托盘连接图标的显示。 如果你愿意我可以发给你C#代码。