Capture.cs

This example demonstrates how to use PacketX to capture packets from C#.
See also:
PacketX , Packet , Adapter
// File:         Capture.cs
//
// Description:  This script demonstrates how to capture packets
//
// Notes:        tlbimp PacketX.dll && csc /R:PacketXLib.dll Capture.cs
//
// Created:      May 26, 2004
//
// Copyright (c) 2000-2004 BeeSync Technologies.

using System;
using PacketXLib;

namespace Capture
{
  class Test 
  {
    // Needed to format packet data
    static System.Globalization.CultureInfo oCulture;

    [MTAThread]
    static void Main(string[] args)
    {
      // Number formatting
      oCulture = new System.Globalization.CultureInfo(0x007F);

      PacketXClass oPktX = new PacketXClass();
      oPktX.OnPacket += new _IPktXPacketXEvents_OnPacketEventHandler(PacketX_OnPacket);
      
      // Display network adapters
      AdapterCollection oAdapters = (AdapterCollection)oPktX.Adapters;
      for (int i = 0; i < oAdapters.Count ; i++) 
      {
        if (Convert.ToBoolean(oAdapters[i+1].IsGood))         
        {
          Console.WriteLine("(" + (i+1) + ") " + oAdapters[i+1].Description);
          //PrintAdapter(oAdapters[i+1]);
        }
      }
      // Select network adapter
      oPktX.Adapter = null;
      while (oPktX.Adapter == null)
      {
        Console.Write("Choose adapter#");
        try 
        { 
          int nSelected = Convert.ToInt16(Console.ReadLine().Trim(),10);
          oPktX.Adapter = oAdapters[nSelected];
        }
        catch (System.Exception)
        {
          Console.WriteLine("Invalid adapter number.");
        }
      }
      // Capture buffer parameters
      Adapter oAdapter = (Adapter)oPktX.Adapter;
      oAdapter.BuffSize=256*1024; // 256 KB
      oAdapter.BuffMinToCopy=0;

      // Hardware filter and capture mode
      oAdapter.HWFilter=PktXPacketType.PktXPacketTypePromiscuous;
      oAdapter.Mode=PktXMode.PktXModeCapture;

      // Start capture
      oPktX.Start();
      System.Threading.Thread.Sleep(60000);                 
      oPktX.Stop();
      
      PrintStats(oAdapter);
    }

    // OnPacket event handler.
    static void PacketX_OnPacket(Packet aPacket)
    {
      PrintHead(aPacket);
      PrintData(aPacket);
    }
    
    static void PrintAdapter(Adapter aAdapter)
    {
      Console.WriteLine("Device name is " + aAdapter.Device);
      Console.Write("Link type is "); 
      switch (aAdapter.LinkType) 
      {
        case PktXLinkType.PktXLinkType802_3:
          Console.WriteLine("Ethernet (802.3)");
          break;
        case PktXLinkType.PktXLinkType802_5:
          Console.WriteLine("Token Ring (802.5)");
          break;
        case PktXLinkType.PktXLinkTypeFddi:
          Console.WriteLine("FDDI");
          break;
        case PktXLinkType.PktXLinkTypeWan:
          Console.WriteLine("WAN");
          break;
        case PktXLinkType.PktXLinkTypeLocalTalk:
          Console.WriteLine("LocalTalk");
          break;
        case PktXLinkType.PktXLinkTypeDix:
          Console.WriteLine("DIX");
          break;
        case PktXLinkType.PktXLinkTypeArcnetRaw:
          Console.WriteLine("ARCNET (raw)");
          break;
        case PktXLinkType.PktXLinkTypeArcnet878_2:
          Console.WriteLine("ARCNET (878.2)");
          break;
        case PktXLinkType.PktXLinkTypeAtm:
          Console.WriteLine("ATM");
          break;
        case PktXLinkType.PktXLinkTypeWirelessWan:
          Console.WriteLine("NdisWirelessXxx media");
          break;
        default: 
          Console.WriteLine("Unknown!");
          break;
      }
      Console.WriteLine("Link speed is " + aAdapter.LinkSpeed + " bps");
      Console.WriteLine("Network IP addres is " + aAdapter.NetIP);
      Console.WriteLine("Network mask is " + aAdapter.NetMask);
      Console.WriteLine("HW address is " + aAdapter.HWAddress);
    }
    
    static void PrintHead(Packet aPacket)
    {
      string sText = "----------------------- Packet Header ---------------------\n";
      
      sText += "Original size " + aPacket.OriginalSize + " bytes\n";
      sText += "Capture size " + aPacket.DataSize + " bytes\n";
      sText += "Capture time " + aPacket.TimeSec + " (number of seconds from 1/1/1970)\n";
      sText += "Capture microseconds " + aPacket.TimeUSec + "\n";
      sText += "Capture date " + aPacket.Date + " (system date and time)";
      
      Console.WriteLine(sText);
    }
    
    static void PrintData(Packet aPacket)
    {     
      string sData = "----------------------- Packet Data -----------------------\n"; 
      
      int nPosition = 0, nColumns = 16;
      for (int i=0; i < aPacket.DataArray.Length; i++)
      {
        if (nPosition == 8)
          sData += " ";

        if (nPosition >= nColumns)
        {
          nPosition = 1;
          sData += "\n";
        }
        else
          nPosition++;

        byte nByte = (byte) aPacket.DataArray.GetValue(i);
        if (nByte < 16)
          sData += "0";

        sData += nByte.ToString("X",oCulture.NumberFormat) + " ";
      }
      Console.WriteLine(sData);
    }
    
    static void PrintStats(Adapter aAdapter)
    {
      string sText = "------------------- Capture Statistics --------------------\n";
      
      sText += "Packets received " + aAdapter.PacketsRecv + "\n";
      sText += "Packets lost " + aAdapter.PacketsLost;
      
      Console.WriteLine(sText);
    }    
  }
}


Copyright © 2000-2007 beeSync. All rights reserved.