I\'m a bit of newbie to c#/.net development, but I\'ve put together a stock tracking application for a small set of assets in my company. I have also set up the database it conn
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
You can also use the events NetworkAvailabilityChanged
and NetworkAddressChanged
in that class to monitor IP address and network availability changes.
EDIT: Be aware that this method checks all available network interfaces that may be on the computer (wireless, lan, etc.). If anyone of them is connected, it will return true.
We have an application that runs mainly in police cars connected via wireless air cards. We needed a way to determine if they were connected or not. We wrote a very small Ping.cs class that pings a predetermined IP or computer name at a regular intervals. We interpret the result message and change the display of a system tray connection icon. If you want I can send you the C# code.
Here's the 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;
}
}
/// <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;
}
}
}
From the Client you would call
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();
Then you would code up methods to capture the PingHost's events defined above
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
}
}
Some more things to remember:
Therefore it's generally best to test for access to the specific resource you need directly.
These resources are volatile; you have to handle the exception when they go down anyway. So it's generally best to just go get a resource as if you know for sure it exists and put your development time in to making sure your exception handler does a nice job with the failures.