Capture.cpp
This example illustrates how to use PacketX from Microsoft C++.
- See also:
- PacketX , Packet , Adapter
#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);
int main(int argc, char* argv[])
{
#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
IPktXPacketXPtr pPktX(__uuidof(PacketX));
LONG lCount= IPktXAdapterCollectionPtr(pPktX->GetAdapters())->GetCount();
for (int i=0; i < lCount; i++)
{
IPktXAdapterPtr pAdapter = IPktXAdapterCollectionPtr(pPktX->GetAdapters())->GetItem(i+1);
if (pAdapter->GetIsGood())
{
_bstr_t bstrtDesciption = pAdapter->GetDescription();
printf("(%d) %s\n",i+1,(char*)bstrtDesciption);
}
}
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& ) {}
}
IPktXAdapterPtr(pPktX->GetAdapter())->PutBuffSize(256*1024);
IPktXAdapterPtr(pPktX->GetAdapter())->PutBuffMinToCopy(0);
IPktXAdapterPtr(pPktX->GetAdapter())->PutHWFilter(PktXPacketTypePromiscuous);
IPktXAdapterPtr(pPktX->GetAdapter())->PutMode(PktXModeCapture);
IPktXPacketSinkPtr pSink(__uuidof(PacketSink));
pSink->CallBackOnPacket((DWORD)__Packet_Handler__,(DWORD)0);
pSink->Advise(pPktX);
pPktX->Start();
#ifdef MT_APARTMENT
Sleep(60000);
#else
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
#endif
pPktX->Stop();
pSink->Unadvise(pPktX);
PrintStats(IPktXAdapterPtr(pPktX->GetAdapter()));
pSink = NULL;
pPktX = NULL;
CoUninitialize();
return 0;
}
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(<ime));
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());
}