Capture.cs
This example demonstrates how to use PacketX to capture packets from C#.
- See also:
- PacketX , Packet , Adapter
using System;
using PacketXLib;
namespace Capture
{
class Test
{
static System.Globalization.CultureInfo oCulture;
[MTAThread]
static void Main(string[] args)
{
oCulture = new System.Globalization.CultureInfo(0x007F);
PacketXClass oPktX = new PacketXClass();
oPktX.OnPacket += new _IPktXPacketXEvents_OnPacketEventHandler(PacketX_OnPacket);
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);
}
}
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.");
}
}
Adapter oAdapter = (Adapter)oPktX.Adapter;
oAdapter.BuffSize=256*1024;
oAdapter.BuffMinToCopy=0;
oAdapter.HWFilter=PktXPacketType.PktXPacketTypePromiscuous;
oAdapter.Mode=PktXMode.PktXModeCapture;
oPktX.Start();
System.Threading.Thread.Sleep(60000);
oPktX.Stop();
PrintStats(oAdapter);
}
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);
}
}
}