Capture.cpp

This example illustrates how to use PacketX from Microsoft C++.
See also:
PacketX , Packet , Adapter
00001 
00002 // File:         Capture.cpp
00003 //
00004 // Description:  This sample demonstrates how to capture packets from C++.
00005 //
00006 // Notes:        Compile with Microsoft Visual C++ 6.0 or .NET
00007 //
00008 // Created:      May 10, 2004
00009 //
00010 // Copyright (c) 2000-2004 BeeSync Technologies.
00012 
00013 #define WIN32_LEAN_AND_MEAN
00014 
00015 #ifndef _WIN32_WINNT
00016 #define _WIN32_WINNT 0x0400
00017 #endif
00018 
00019 #include <atlbase.h>
00020 #include <stdio.h>
00021 #include <time.h>
00022 
00023 #import "PacketX.dll" no_namespace, named_guids
00024 
00025 static HRESULT __Packet_Handler__(IPktXPacket* pPacket,DWORD dwParam);
00026 
00027 static void ShowNetworkAdapter(IPktXAdapterPtr& pAdapter);
00028 static void PrintHead(IPktXPacket* pPacket);
00029 static void PrintData(IPktXPacket* pPacket);
00030 static void PrintStats(IPktXAdapterPtr& pAdapter);
00031 
00032 // Main entry point
00033 int main(int argc, char* argv[])
00034 {
00035    // Initialize COM
00036 #define MT_APARTMENT // Uncomment this line if you want to run it in multithreaded apartment
00037 #ifdef MT_APARTMENT
00038    CoInitializeEx(NULL,COINIT_MULTITHREADED);
00039 #else
00040    CoInitialize(NULL);
00041 #endif
00042 
00043    // Create PacketX object
00044    IPktXPacketXPtr pPktX(__uuidof(PacketX));
00045 
00046    // Display network adapters
00047    LONG lCount= IPktXAdapterCollectionPtr(pPktX->GetAdapters())->GetCount();
00048    for (int i=0; i < lCount; i++)
00049    {
00050       // If adapter is good print adapter properties
00051       IPktXAdapterPtr pAdapter = IPktXAdapterCollectionPtr(pPktX->GetAdapters())->GetItem(i+1);
00052       if (pAdapter->GetIsGood())
00053       {
00054          _bstr_t bstrtDesciption = pAdapter->GetDescription();
00055          printf("(%d) %s\n",i+1,(char*)bstrtDesciption);
00056          //ShowNetworkAdapter(pAdapter);
00057       }
00058    }
00059    // Select network adapter
00060    pPktX->PutAdapter(NULL);
00061    while (pPktX->GetAdapter() == NULL)
00062    {
00063       char buffer[256];
00064       printf("Choose adapter#");
00065       try { pPktX->PutAdapter(IPktXAdapterCollectionPtr(
00066          pPktX->GetAdapters())->GetItem(atoi(gets(buffer)))); }
00067       catch ( _com_error& ) {}
00068    }
00069    // Setting buffer parameters
00070    IPktXAdapterPtr(pPktX->GetAdapter())->PutBuffSize(256*1024); // 256 KB
00071    IPktXAdapterPtr(pPktX->GetAdapter())->PutBuffMinToCopy(0);
00072 
00073    // Setting adapter to capture packets in promiscuous mode
00074    IPktXAdapterPtr(pPktX->GetAdapter())->PutHWFilter(PktXPacketTypePromiscuous);
00075    IPktXAdapterPtr(pPktX->GetAdapter())->PutMode(PktXModeCapture);
00076 
00077    // Create sink
00078    IPktXPacketSinkPtr pSink(__uuidof(PacketSink));
00079    pSink->CallBackOnPacket((DWORD)__Packet_Handler__,(DWORD)0);
00080 
00081    // Bind sink to PacketX
00082    pSink->Advise(pPktX);
00083 
00084    // Start capture
00085    pPktX->Start();
00086 
00087 #ifdef MT_APARTMENT
00088    Sleep(60000);
00089 #else
00090    // Message loop
00091    MSG msg;
00092    while (GetMessage(&msg, 0, 0, 0))
00093       DispatchMessage(&msg);
00094 #endif
00095    // Stop capture
00096    pPktX->Stop();
00097 
00098    // Unadvise sink from PacketX
00099    pSink->Unadvise(pPktX);
00100 
00101    // Adapter capture statistics
00102    PrintStats(IPktXAdapterPtr(pPktX->GetAdapter()));
00103 
00104    // Cleanup
00105    pSink = NULL;
00106    pPktX = NULL;
00107 
00108    CoUninitialize();
00109    return 0;
00110 }
00111 
00112 // Packet event handler
00113 static HRESULT __Packet_Handler__(IPktXPacket* pPacket,DWORD dwParam)
00114 {
00115    PrintHead(pPacket);
00116    PrintData(pPacket);
00117    return 0;
00118 }
00119 
00120 static void PrintHead(IPktXPacket* pPacket)
00121 {
00122    printf("\n----------------------- Packet Header ---------------------");
00123    printf("\nOriginal size %d bytes",
00124       IPktXPacketPtr(pPacket)->GetOriginalSize());
00125    printf("\nCapture size %d bytes",
00126       IPktXPacketPtr(pPacket)->GetDataSize());
00127    time_t ltime = IPktXPacketPtr(pPacket)->GetTimeSec();
00128    printf("\nCapture time %s",ctime(&ltime));
00129    printf("Capture microsecs %d",
00130       IPktXPacketPtr(pPacket)->GetTimeUSec());
00131 }
00132 
00133 static void PrintData(IPktXPacket* pPacket)
00134 {
00135    printf("\n----------------------- Packet Data -----------------------");
00136    CComVariant varArray = IPktXPacketPtr(pPacket)->GetData();
00137    LPVARIANT lpVariant=NULL;
00138    SafeArrayAccessData(varArray.parray,(LPVOID*)&lpVariant);
00139    ULONG ulElements = varArray.parray->rgsabound[0].cElements;
00140    int iPosition = 0;
00141    for (unsigned int i=0; i < ulElements; i++)
00142    {
00143       if (iPosition >= 20 || i==0) {
00144          printf("\n");
00145          iPosition = 1;
00146       }
00147       else
00148          iPosition++;
00149       printf("%0.2X ",V_UI1(&lpVariant[i]));
00150    }
00151    SafeArrayUnaccessData(varArray.parray);
00152 }
00153 
00154 static void PrintStats(IPktXAdapterPtr& pAdapter)
00155 {
00156    printf("\n------------------- Capture Statistics --------------------");
00157    printf("\nPackets received %d", pAdapter->GetPacketsRecv());
00158    printf("\nPackets lost %d", pAdapter->GetPacketsLost());
00159 }
00160 
00161 static void ShowNetworkAdapter(IPktXAdapterPtr& pAdapter)
00162 {
00163    _bstr_t bstrtDevice = pAdapter->GetDevice();
00164    _bstr_t bstrtDescription = pAdapter->GetDescription();
00165    _bstr_t bstrtNetIP = pAdapter->GetNetIP();
00166    _bstr_t bstrtNetMask = pAdapter->GetNetMask();
00167 
00168    printf("%s\n",(char*) bstrtDescription);
00169    printf("Device: %s\n",(char*) bstrtDevice);
00170    printf("Net IP: %s\n",(char*) bstrtNetIP);
00171    printf("Net Mask: %s\n",(char*) bstrtNetMask);
00172    printf("Link type is ");
00173 
00174    switch(pAdapter->GetLinkType())
00175    {
00176       case(PktXLinkType802_3):      printf("Ethernet (802.3)\n");     break;
00177       case(PktXLinkType802_5):      printf("Token Ring (802.5)\n");   break;
00178       case(PktXLinkTypeFddi):       printf("FDDI\n");                 break;
00179       case(PktXLinkTypeWan):        printf("WAN\n");                  break;
00180       case(PktXLinkTypeLocalTalk):  printf("LocalTalk\n");            break;
00181       case(PktXLinkTypeDix):        printf("DIX\n");                  break;
00182       case(PktXLinkTypeArcnetRaw):  printf("ARCNET (raw)\n");         break;
00183       case(PktXLinkTypeArcnet878_2):printf("ARCNET (878.2)\n");       break;
00184       case(PktXLinkTypeAtm):        printf("ATM\n");                  break;
00185       case(PktXLinkTypeWirelessWan):printf("NdisWirelessXxx media\n");break;
00186       default:                      printf("Unknown!\n");             break;
00187    }
00188    printf("Link speed is %d bps\n",pAdapter->GetLinkSpeed());
00189 }

Copyright © 2000-2007 beeSync. All rights reserved.