PingCompletedEventHandler Delegate


The .NET API Reference documentation has a new home. Visit the .NET API Browser on to see the new experience.

Represents the method that will handle the PingCompleted event of a Ping object.

Namespace:   System.Net.NetworkInformation
Assembly:  System (in System.dll)

public delegate void PingCompletedEventHandler(
	Object^ sender,
	PingCompletedEventArgs^ e


Type: System::Object^

The source of the PingCompleted event.

Type: System.Net.NetworkInformation::PingCompletedEventArgs^

A PingCompletedEventArgs object that contains the event data.

User data that is specified in a SendAsync call is available to the method invoked by this delegate in the UserState property.

The following code example demonstrates specifying a PingCompletedEventHandler to respond to a PingCompleted event.

#using <System.dll>

using namespace System;
using namespace System::Text;
using namespace System::Net;
using namespace System::Net::NetworkInformation;
using namespace System::ComponentModel;
using namespace System::Threading;
void PingCompletedCallback( Object^ sender, PingCompletedEventArgs^ e );
void DisplayReply( PingReply^ reply );
int main()
   array<String^>^args = Environment::GetCommandLineArgs();
   if ( args->Length == 1 )
      throw gcnew ArgumentException( "Ping needs a host or IP Address." );

   String^ who = args[ 1 ];
   AutoResetEvent^ waiter = gcnew AutoResetEvent( false );

   Ping ^ pingSender = gcnew Ping;

   // When the PingCompleted event is raised,
   // the PingCompletedCallback method is called.
   pingSender->PingCompleted += gcnew PingCompletedEventHandler( PingCompletedCallback );

   // Create a buffer of 32 bytes of data to be transmitted.
   String^ data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
   array<Byte>^buffer = Encoding::ASCII->GetBytes( data );

   // Wait 12 seconds for a reply.
   int timeout = 12000;

   // Set options for transmission:
   // The data can go through 64 gateways or routers
   // before it is destroyed, and the data packet
   // cannot be fragmented.
   PingOptions ^ options = gcnew PingOptions( 64,true );
   Console::WriteLine( "Time to live: {0}", options->Ttl );
   Console::WriteLine( "Don't fragment: {0}", options->DontFragment );

   // Send the ping asynchronously.
   // Use the waiter as the user token.
   // When the callback completes, it can wake up this thread.
   pingSender->SendAsync( who, timeout, buffer, options, waiter );

   // Prevent this example application from ending.
   // A real application should do something useful
   // when possible.
   Console::WriteLine( "Ping example completed." );

void PingCompletedCallback( Object^ /*sender*/, PingCompletedEventArgs^ e )

   // If the operation was canceled, display a message to the user.
   if ( e->Cancelled )
      Console::WriteLine( "Ping canceled." );

      // Let the main thread resume. 
      // UserToken is the AutoResetEvent object that the main thread 
      // is waiting for.

   // If an error occurred, display the exception to the user.
   if ( e->Error != nullptr )
      Console::WriteLine( "Ping failed:" );
      Console::WriteLine( e->Error->ToString() );

      // Let the main thread resume. 

   PingReply ^ reply = e->Reply;
   DisplayReply( reply );

   // Let the main thread resume.

void DisplayReply( PingReply ^ reply )
   if ( reply == nullptr )

   Console::WriteLine( "ping status: {0}", reply->Status );
   if ( reply->Status == IPStatus::Success )
      Console::WriteLine( "Address: {0}", reply->Address->ToString() );
      Console::WriteLine( "RoundTrip time: {0}", reply->RoundtripTime );
      Console::WriteLine( "Time to live: {0}", reply->Options->Ttl );
      Console::WriteLine( "Don't fragment: {0}", reply->Options->DontFragment );
      Console::WriteLine( "Buffer size: {0}", reply->Buffer->Length );

.NET Framework
Available since 2.0
Return to top