How to use ICMP in a Visual C++ project
Network Component provides an easy-to-use development interface to a variety of IP protocols. By using Network Component, you can very easily create or enhance applications with network features.
Network Component features the following: DNS, FTP, HTTP, HTTPs, ICMP Ping, IP-to-Country, MSN, NTP, RSH, SCP, SFTP, SNMP v1/v2c (Get, GetNext, Set), SNMP Traps, SNMP MIB, SSH, TCP, Telnet, TFTP, UDP, Telnet, Wake-On-LAN and more.
Network Component can be well integrated into any development platform that supports ActiveX objects.
Step 1: Download and install the Network Component
Download Network Component from the ActiveXperts Download Site and start the installation. The installation guides you through the installation process.
Step 2: Create a new Visual C++ project
Launch 'Microsoft Visual C++' from the Start menu, and choose 'New' from the 'File Menu'. The 'New' dialog appears.
Select the type of project (for instance: 'Win32 Console Application'), enter a 'Project name' and select the 'Location':
Select the kind of project, for instance a 'Hello, world!' application and click 'Finish':
Step 3: Refer to the Network Component Library and declare the objects
A new Project is created now.
Before you can use Network Component, you need to refer to the Network Component library. The actually reference files are shipped with the product and are located in the following directory:
C:\Program Files\ActiveXperts\Network Component\Examples\Visual C++\Include
Copy all files in the above directory ('AxNetwork.c', 'AxNetwork_i.c' and 'AxNetworkConstants.h') to your project directory.
IIcmp *pIcmp = NULL;
Appendix: Full source code
// Demo.cpp : Defines the entry point for the console application. // #include <windows.h> #include <stdio.h> #include <comdef.h> #include <atlbase.h> #include "..\..\include\AxNetworkConstants.h" #include "..\..\include\AxNetwork.h" #include "..\..\include\AxNetwork_i.c" //////////////////////////////////////////////////////////////////////////////// LPTSTR ReadInput( LPCTSTR lpszTitle, BOOL bAllowEmpty = FALSE ); VOID PrintComponentInfo( IIcmp *pIcmp ); LPTSTR GetErrorDescription( LONG lLastError, IIcmp *pIcmp ); //////////////////////////////////////////////////////////////////////////////// int main() { IIcmp *pIcmp = NULL; HRESULT hr; LONG lLastError = -1L; LONG lLastDuration = -1L, lLastTtl = -1L; LPTSTR lptszHost = NULL; int i; // Initialize COM CoInitialize(NULL); // Create objects hr = CoCreateInstance( CLSID_Icmp, NULL, CLSCTX_INPROC_SERVER, IID_IIcmp, (void**) &pIcmp ); if( ! SUCCEEDED( hr ) ) { _tprintf( _T("Unable to create Icmp object.\n") ); goto _EndMain; } // A license key is required to unlock this component after the trial period has expired. // Call 'Activate' with a valid license key as its first parameter. Second parameter determines whether to save the license key permanently // to the registry (True, so you need to call Activate only once), or not to store the key permanently (False, so you need to call Activate // every time the component is created). For details, see manual, chapter "Product Activation". /* pIcmp->Activate( _T("XXXXX-XXXXX-XXXXX", False ); */ // Component information PrintComponentInfo( pIcmp ); lptszHost = ReadInput( _T("Enter host: ") ); pIcmp->put_Ttl( 255 ); for( i = 0; i < 4; i++ ) { pIcmp->Ping( _bstr_t( lptszHost ), 5000 ); // 5000: timeout in msecs pIcmp->get_LastError( &lLastError ); if( lLastError != 0 ) { _tprintf( _T("Ping, result: %ld (%s)\n"), lLastError, GetErrorDescription( lLastError, pIcmp ) ); } else { pIcmp->get_LastDuration( &lLastDuration ); pIcmp->get_LastTtl( &lLastTtl ); _tprintf( _T("Reply from %s; time=%ld TTL=%ld\n"), lptszHost, lLastDuration, lLastTtl ); } Sleep( 1000 ); } _tprintf( _T("\n") ); _EndMain: if( pIcmp != NULL ) pIcmp->Release(); CoUninitialize(); _tprintf( _T("Ready.\n") ); return 0; } /////////////////////////////////////////////////////////////////////////////////////////// LPTSTR ReadInput( LPCTSTR lptszTitle, BOOL bAllowEmpty ) { static TCHAR tszInput [ 255 + 1 ] = { _T('\0') }; _tprintf( _T("%s:\n"), lptszTitle ); do { _tprintf ( _T(" > ") ); fflush(stdin); fflush(stdout); _fgetts( tszInput, 255, stdin ); if( tszInput[ 0 ] != _T('\0') && tszInput[ _tcsclen( tszInput ) - 1 ] == _T('\n') ) tszInput[ _tcsclen( tszInput ) - 1 ] = _T('\0'); } while( _tcsclen ( tszInput ) == 0 && ! bAllowEmpty ); return tszInput; } /////////////////////////////////////////////////////////////////////////////////////////// LPTSTR GetErrorDescription( LONG lLastError, IIcmp *pIcmp ) { static TCHAR tszErrorDescription[ 1024 + 1 ] = { _T('\0') }; BSTR bstrErrDescr = NULL; pIcmp->GetErrorDescription( lLastError, &bstrErrDescr ); if( bstrErrDescr != NULL ) { _stprintf_s( tszErrorDescription, 1024, _T("%ls"), bstrErrDescr ); SysFreeString ( bstrErrDescr ); } return tszErrorDescription; } /////////////////////////////////////////////////////////////////////////////////////////// VOID PrintComponentInfo( IIcmp *pIcmp ) { /* BSTR bstrVersion = NULL, bstrBuild = NULL, bstrModule = NULL, bstrLicenseStatus = NULL, bstrLicenseKey = NULL; pIcmp->get_Version( &bstrVersion ); pIcmp->get_Build( &bstrBuild ); pIcmp->get_Module( &bstrModule ); pIcmp->get_LicenseStatus( &bstrLicenseStatus ); pIcmp->get_LicenseKey( &bstrLicenseKey ); // Component info _tprintf( _T("ActiveXperts Email Component %s\nBuild: %s\nModule: %s\nLicense Status: %s\nLicense Key: %s\n\n"), bstrVersion, bstrBuild, bstrModule, bstrLicenseStatus, bstrLicenseKey ); */ }
You can download the complete samples here. There are many other working Network Component scripts on our site and shipped with the product.
NOTE: Demo Projects are created with Microsoft Visual Studio 2008
The Network Component project ships with a set of Microsoft Visual Studio .NET samples, including samples for Microsoft Visual C# .NET. The projects are created with Microsoft Visual Studio 2008.
Users with a later version of Microsoft Visual Studio can open such a project. The Visual Studio Conversion Wizard will guide you through the process of converting the project to the version used.