Click here to Skip to main content
6,596,602 members and growing! (21,352 online)
Email Password   helpLost your password?
Platforms, Frameworks & Libraries » .NET Framework » General     Intermediate

C# Ping Component

By Wesley Brown

An easy to use C# ping component.
C#, VB, Windows, .NET 1.1VS.NET2003, Dev
Posted:30 Mar 2005
Views:157,853
Bookmarked:57 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
26 votes for this article.
Popularity: 5.42 Rating: 3.83 out of 5
3 votes, 11.5%
1
1 vote, 3.8%
2

3
11 votes, 42.3%
4
11 votes, 42.3%
5

Sample Image - CSharpPing.jpg

Introduction

While working on a project that needs to check the quality of the network connection, I've found that there is no easy way to ping another computer. I expected there would be something in the framework (somewhere in the System.NET namespace) to do this as it seems like a common thing to want to do, but I could find nothing so my search turned to the web. While I was able to find some c# ping examples, none of them were very well designed. I wanted a ping utility that would let me ping a remote machine any number of times and return the ping statistics in a sensible manner (that is, not something I'd have to parse) so I decided that I'd make my own.

Most of the ping code I saw on the net seemed to be derived from this MSDN article written by Lance Olson which was written way back when for the Beta 1 release of .Net (whether it cited him or not...). I based my ping utility on this code along with this article, written by Peter A. Bromberg, PhD, which updated the Olson's code to work with .NET version 1. Using this code as a starting point I've tried to make it a little more OO by creating a couple more classes and moving the code around, so that they do their own work. I think the code makes a lot more sense now and is much easier to understand and use. I used the Windows command line ping command as a baseline for the information I wanted to return, so I created a PingResponse object that encapsulates all and gets returned instead of an int or string. I'm not going to write up a detailed description of exactly how the code works as it is either self-explanatory or simply works because that's how you have to do it (most of the ICMP class). I've included a very simple client form to show how to use the ping utility asynchronously, which I imagine, how you'd want to use it most of the time.

Using the code

To use this component simply create a Ping object and call the PingHost or BeginPingHost function.

Synchronous Example:

private void Ping(string hostname)
{
    //Create ping object

    Ping netMon = new Ping();

    //Ping host (this will block until complete)

    PingResponse response = netMon.PingHost(hostname, 4);

    //Process ping response

    if (response != null)
    {
        ProcessResponse(response);
    }
}

Asynchronous Example:

//Create ping object

Ping netMon = new netMon();

private void Load()
{
    //Wire events (in constructor or InitializeComponent)

    netMon.PingError += new PingErrorEventHandler(netMon_PingError);
    netMon.PingStarted += new PingStartedEventHandler(netMon_PingStarted);
    netMon.PingResponse += new PingResponseEventHandler(netMon_PingResponse);
    netMon.PingCompleted += new PingCompletedEventHandler(netMon_PingCompleted);
}

private void Ping(string hostname)
{
    //Start ping

    IAsyncResult result = netMon.BeginPingHost(
                     new AsyncCallback(EndPing), hostname, 4);
}

private void EndPing(IAsyncResult result)
{
    netMon.EndPingHost(result);
}

private void netMon_PingStarted(object sender, PingStartedEventArgs e)
{
    //Process ping started

}

private void netMon_PingResponse(object sender, PingResponseEventArgs e)
{
    //Process ping response

}

private void netMon_PingCompleted(object sender, PingCompletedEventArgs e)
{
    //Process ping completed

}

private void netMon_PingError(object sender, PingErrorEventArgs e)
{
    //Process ping error

}

Known Issues / Further Enhancements

  • The first ping is sometimes longer than it should be. I suspect this is because of some extra time taken to create the initial socket connection and could be eliminated by simply dropping that first ping time.
  • Currently, you can only cancel when the PingResponse event is fired. It would be nice to be able to cancel at any time and have it processed immediately.
  • I should really keep track of the ping response type per response instead of for the whole set of responses. I simply haven't got around to change the PingReponse yet.

History

  • Version 1.0: Initial release.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Wesley Brown


Member

Occupation: Web Developer
Location: United States United States

Other popular .NET Framework articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 46 (Total in Forum: 46) (Refresh)FirstPrevNext
GeneralThanks for great code but you have some bugs. Pinmembermrali863:55 26 Sep '09  
GeneralSource code not running Pinmembersaurabh921:28 31 Aug '09  
GeneralRe: Source code not running PinmvpChristian Graus21:13 8 Sep '09  
GeneralSuggestion PinmemberJared Mcguire9:54 24 Apr '08  
GeneralRe: Suggestion PinmemberCBlackburn1:07 3 Aug '08  
GeneralRe: Suggestion PinmemberArash Javadi22:08 13 May '09  
GeneralAnswer: Timeouts Pinmemberimbored11:48 26 Mar '08  
GeneralRe: Answer: Timeouts PinmemberCBlackburn1:07 3 Aug '08  
QuestionMultithread error. False success messages PinmemberGokcer Gokdal10:07 26 Feb '08  
AnswerRe: Multithread error. False success messages Pinmemberyrleu0:14 25 Nov '08  
Generala lot of time... PinmemberTal Hakemon3:43 7 Mar '07  
GeneralProblem running ur code in web application Pinmemberjk8522:01 9 Jun '06  
GeneralRe: Problem running ur code in web application Pinmembericebob23:50 7 Jan '07  
QuestionSocket Exception PinmemberRyan Homer6:38 11 Apr '06  
AnswerRe: Socket Exception PinmemberRyan Homer6:41 11 Apr '06  
GeneralRe: Socket Exception PinmemberWesley Brown8:00 11 Apr '06  
NewsRe: Socket Exception PinmemberRyan Homer3:58 12 Apr '06  
GeneralSynchronous timeout parameter not what it seems PinmemberRoland_W3:41 6 Feb '06  
GeneralCode update PinmemberJohan Roos2:02 27 Jan '06  
QuestionStatistical error? PinmemberRicardo Mendes7:19 20 Dec '05  
Generalerror? Pinmembermissjasper8:21 12 Dec '05  
AnswerRe: error? Pinmembersimonnews12:59 29 Dec '08  
GeneralSystem.Net.NetworkInformation.Ping PinmemberKristofer Liljeblad12:28 18 Nov '05  
GeneralRe: System.Net.NetworkInformation.Ping PinmemberDigiOz Multimedia8:38 17 Oct '07  
Generalunmanaged code PinmemberThPloeger2:52 27 Sep '05  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 30 Mar 2005
Editor: Sumalatha K.R.
Copyright 2005 by Wesley Brown
Everything else Copyright © CodeProject, 1999-2009
Web17 | Advertise on the Code Project