Capture.cpp

This example illustrates how to use PacketX from Microsoft C++.
See also:
PacketX , Packet , Adapter
// File:         Capture.cpp
//
// Description:  This sample demonstrates how to capture packets from C++.
//
// Notes:        Compile with Microsoft Visual C++ 6.0 or .NET
//
// Created:      May 10, 2004
//
// Copyright (c) 2000-2004 BeeSync Technologies.

#define WIN32_LEAN_AND_MEAN

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

#include <atlbase.h>
#include <stdio.h>
#include <time.h>

#import "PacketX.dll" no_namespace, named_guids

static HRESULT __Packet_Handler__(IPktXPacket* pPacket,DWORD dwParam);

static void ShowNetworkAdapter(IPktXAdapterPtr& pAdapter);
static void PrintHead(IPktXPacket* pPacket);
static void PrintData(IPktXPacket* pPacket);
static void PrintStats(IPktXAdapterPtr& pAdapter);

// Main entry point
int main(int argc, char* argv[])
{
   // Initialize COM
#define MT_APARTMENT // Uncomment this line if you want to run it in multithreaded apartment
#ifdef MT_APARTMENT
   CoInitializeEx(NULL,COINIT_MULTITHREADED);
#else
   CoInitialize(NULL);
#endif

   // Create PacketX object
   IPktXPacketXPtr pPktX(__uuidof(PacketX));

   // Display network adapters
   LONG lCount= IPktXAdapterCollectionPtr(pPktX->GetAdapters())->GetCount();
   for (int i=0; i < lCount; i++)
   {
      // If adapter is good print adapter properties
      IPktXAdapterPtr pAdapter = IPktXAdapterCollectionPtr(pPktX->GetAdapters())->GetItem(i+1);
      if (pAdapter->GetIsGood())
      {
         _bstr_t bstrtDesciption = pAdapter->GetDescription();
         printf("(%d) %s\n",i+1,(char*)bstrtDesciption);
         //ShowNetworkAdapter(pAdapter);
      }
   }
   // Select network adapter
   pPktX->PutAdapter(NULL);
   while (pPktX->GetAdapter() == NULL)
   {
      char buffer[256];
      printf("Choose adapter#");
      try { pPktX->PutAdapter(IPktXAdapterCollectionPtr(
         pPktX->GetAdapters())->GetItem(atoi(gets(buffer)))); }
      catch ( _com_error& ) {}
   }
   // Setting buffer parameters
   IPktXAdapterPtr(pPktX->GetAdapter())->PutBuffSize(256*1024); // 256 KB
   IPktXAdapterPtr(pPktX->GetAdapter())->PutBuffMinToCopy(0);

   // Setting adapter to capture packets in promiscuous mode
   IPktXAdapterPtr(pPktX->GetAdapter())->PutHWFilter(PktXPacketTypePromiscuous);
   IPktXAdapterPtr(pPktX->GetAdapter())->PutMode(PktXModeCapture);

   // Create sink
   IPktXPacketSinkPtr pSink(__uuidof(PacketSink));
   pSink->CallBackOnPacket((DWORD)__Packet_Handler__,(DWORD)0);

   // Bind sink to PacketX
   pSink->Advise(pPktX);

   // Start capture
   pPktX->Start();

#ifdef MT_APARTMENT
   Sleep(60000);
#else
   // Message loop
   MSG msg;
   while (GetMessage(&msg, 0, 0, 0))
      DispatchMessage(&msg);
#endif
   // Stop capture
   pPktX->Stop();

   // Unadvise sink from PacketX
   pSink->Unadvise(pPktX);

   // Adapter capture statistics
   PrintStats(IPktXAdapterPtr(pPktX->GetAdapter()));

   // Cleanup
   pSink = NULL;
   pPktX = NULL;

   CoUninitialize();
   return 0;
}

// Packet event handler
static HRESULT __Packet_Handler__(IPktXPacket* pPacket,DWORD dwParam)
{
   PrintHead(pPacket);
   PrintData(pPacket);
   return 0;
}

static void PrintHead(IPktXPacket* pPacket)
{
   printf("\n----------------------- Packet Header ---------------------");
   printf("\nOriginal size %d bytes",
      IPktXPacketPtr(pPacket)->GetOriginalSize());
   printf("\nCapture size %d bytes",
      IPktXPacketPtr(pPacket)->GetDataSize());
   time_t ltime = IPktXPacketPtr(pPacket)->GetTimeSec();
   printf("\nCapture time %s",ctime(&ltime));
   printf("Capture microsecs %d",
      IPktXPacketPtr(pPacket)->GetTimeUSec());
}

static void PrintData(IPktXPacket* pPacket)
{
   printf("\n----------------------- Packet Data -----------------------");
   CComVariant varArray = IPktXPacketPtr(pPacket)->GetData();
   LPVARIANT lpVariant=NULL;
   SafeArrayAccessData(varArray.parray,(LPVOID*)&lpVariant);
   ULONG ulElements = varArray.parray->rgsabound[0].cElements;
   int iPosition = 0;
   for (unsigned int i=0; i < ulElements; i++)
   {
      if (iPosition >= 20 || i==0) {
         printf("\n");
         iPosition = 1;
      }
      else
         iPosition++;
      printf("%0.2X ",V_UI1(&lpVariant[i]));
   }
   SafeArrayUnaccessData(varArray.parray);
}

static void PrintStats(IPktXAdapterPtr& pAdapter)
{
   printf("\n------------------- Capture Statistics --------------------");
   printf("\nPackets received %d", pAdapter->GetPacketsRecv());
   printf("\nPackets lost %d", pAdapter->GetPacketsLost());
}

static void ShowNetworkAdapter(IPktXAdapterPtr& pAdapter)
{
   _bstr_t bstrtDevice = pAdapter->GetDevice();
   _bstr_t bstrtDescription = pAdapter->GetDescription();
   _bstr_t bstrtNetIP = pAdapter->GetNetIP();
   _bstr_t bstrtNetMask = pAdapter->GetNetMask();

   printf("%s\n",(char*) bstrtDescription);
   printf("Device: %s\n",(char*) bstrtDevice);
   printf("Net IP: %s\n",(char*) bstrtNetIP);
   printf("Net Mask: %s\n",(char*) bstrtNetMask);
   printf("Link type is ");

   switch(pAdapter->GetLinkType())
   {
      case(PktXLinkType802_3):      printf("Ethernet (802.3)\n");     break;
      case(PktXLinkType802_5):      printf("Token Ring (802.5)\n");   break;
      case(PktXLinkTypeFddi):       printf("FDDI\n");                 break;
      case(PktXLinkTypeWan):        printf("WAN\n");                  break;
      case(PktXLinkTypeLocalTalk):  printf("LocalTalk\n");            break;
      case(PktXLinkTypeDix):        printf("DIX\n");                  break;
      case(PktXLinkTypeArcnetRaw):  printf("ARCNET (raw)\n");         break;
      case(PktXLinkTypeArcnet878_2):printf("ARCNET (878.2)\n");       break;
      case(PktXLinkTypeAtm):        printf("ATM\n");                  break;
      case(PktXLinkTypeWirelessWan):printf("NdisWirelessXxx media\n");break;
      default:                      printf("Unknown!\n");             break;
   }
   printf("Link speed is %d bps\n",pAdapter->GetLinkSpeed());
}

Copyright © 2000-2007 beeSync. All rights reserved.