Commit 6a6df7e5 authored by Brickner_cp's avatar Brickner_cp

--no commit message

--no commit message
parent 9d657b7a
......@@ -5,7 +5,7 @@ using System.Text;
namespace Packets
{
public class Packet
public class Packet : IEquatable<Packet>
{
public Packet(byte[] data, DateTime timestamp, IDataLink dataLink)
{
......@@ -14,6 +14,11 @@ namespace Packets
_dataLink = dataLink;
}
public byte this[int offset]
{
get { return _data[offset]; }
}
public int Length
{
get { return _data.Length; }
......@@ -34,6 +39,24 @@ namespace Packets
get { return _data; }
}
public bool Equals(Packet other)
{
if (Length != other.Length)
return false;
for (int i = 0; i != Length; ++i)
{
if (this[i] != other[i])
return false;
}
return true;
}
public override bool Equals(object obj)
{
return Equals(obj as Packet);
}
private readonly byte[] _data;
private readonly DateTime _timestamp;
private readonly IDataLink _dataLink;
......
......@@ -90,19 +90,19 @@ namespace WinPcapDotNet.Console
using (PacketCommunicator deviceHandler = device.Open())
{
deviceHandler.SetFilter(filter);
deviceHandler.Mode = DeviceHandlerMode.Statistics;
deviceHandler.Mode = PacketCommunicatorMode.Statistics;
for (int i = 0; i != 10; ++i)
{
PacketSampleStatistics statistics;
DeviceHandlerResult result = deviceHandler.GetNextStatistics(out statistics);
PacketCommunicatorReceiveResult result = deviceHandler.GetNextStatistics(out statistics);
switch (result)
{
case DeviceHandlerResult.Ok:
case PacketCommunicatorReceiveResult.Ok:
break;
case DeviceHandlerResult.Timeout:
case PacketCommunicatorReceiveResult.Timeout:
continue;
case DeviceHandlerResult.Eof:
case PacketCommunicatorReceiveResult.Eof:
continue;
}
......@@ -121,14 +121,14 @@ namespace WinPcapDotNet.Console
for (int i = 0; i != 100; ++i)
{
Packet packet;
DeviceHandlerResult result = offlineHandler.GetPacket(out packet);
PacketCommunicatorReceiveResult result = offlineHandler.GetPacket(out packet);
switch (result)
{
case DeviceHandlerResult.Ok:
case PacketCommunicatorReceiveResult.Ok:
break;
case DeviceHandlerResult.Timeout:
case PacketCommunicatorReceiveResult.Timeout:
continue;
case DeviceHandlerResult.Eof:
case PacketCommunicatorReceiveResult.Eof:
continue;
}
......@@ -153,14 +153,14 @@ namespace WinPcapDotNet.Console
for (int i = 0; i != 100; ++i)
{
Packet packet;
DeviceHandlerResult result = offlineHandler.GetPacket(out packet);
PacketCommunicatorReceiveResult result = offlineHandler.GetPacket(out packet);
switch (result)
{
case DeviceHandlerResult.Ok:
case PacketCommunicatorReceiveResult.Ok:
break;
case DeviceHandlerResult.Timeout:
case PacketCommunicatorReceiveResult.Timeout:
continue;
case DeviceHandlerResult.Eof:
case PacketCommunicatorReceiveResult.Eof:
continue;
}
......@@ -179,14 +179,14 @@ namespace WinPcapDotNet.Console
for (int i = 0; i != 100; ++i)
{
Packet packet;
DeviceHandlerResult result = liveHandler.GetPacket(out packet);
PacketCommunicatorReceiveResult result = liveHandler.GetPacket(out packet);
switch (result)
{
case DeviceHandlerResult.Ok:
case PacketCommunicatorReceiveResult.Ok:
break;
case DeviceHandlerResult.Timeout:
case PacketCommunicatorReceiveResult.Timeout:
continue;
case DeviceHandlerResult.Eof:
case PacketCommunicatorReceiveResult.Eof:
continue;
}
......
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using Packets;
using Microsoft.VisualStudio.TestTools.UnitTesting;
......@@ -66,9 +67,9 @@ namespace PcapDotNet.Core.Test
const string DestinationMac = "77:88:99:AA:BB:CC";
const int NumPacketsToSend = 10;
using (PacketCommunicator deviceHandler = OpenLiveDevice())
using (PacketCommunicator communicator = OpenLiveDevice())
{
deviceHandler.SetFilter("ether src " + SourceMac + " and ether dst " + DestinationMac);
communicator.SetFilter("ether src " + SourceMac + " and ether dst " + DestinationMac);
Packet sentPacket = PacketBuilder.Ethernet(DateTime.Now,
new MacAddress(SourceMac),
......@@ -79,20 +80,94 @@ namespace PcapDotNet.Core.Test
DateTime startSendingTime = DateTime.Now;
for (int i = 0; i != NumPacketsToSend; ++i)
deviceHandler.SendPacket(sentPacket);
communicator.SendPacket(sentPacket);
DateTime endSendingTime = DateTime.Now;
Packet packet;
DeviceHandlerResult result = deviceHandler.GetPacket(out packet);
PacketCommunicatorReceiveResult result = communicator.GetPacket(out packet);
Assert.AreEqual(DeviceHandlerResult.Ok, result);
Assert.AreEqual<uint>(NumPacketsToSend, deviceHandler.TotalStatistics.PacketsCaptured);
Assert.AreEqual(PacketCommunicatorReceiveResult.Ok, result);
Assert.AreEqual<uint>(NumPacketsToSend, communicator.TotalStatistics.PacketsCaptured);
Assert.AreEqual(sentPacket.Length, packet.Length);
MoreAssert.IsInRange(startSendingTime - TimeSpan.FromSeconds(1), endSendingTime + TimeSpan.FromSeconds(30), packet.Timestamp);
}
}
[TestMethod]
public void DumpPacketsTest()
{
const string SourceMac = "11:22:33:44:55:66";
const string DestinationMac = "77:88:99:AA:BB:CC";
string dumpFilename = Path.GetTempPath() + @"dump.pcap";
Packet expectedPacket = PacketBuilder.Ethernet(DateTime.Now,
new MacAddress(SourceMac),
new MacAddress(DestinationMac),
EthernetType.IpV4,
new Datagram(new byte[10], 0, 10));
using (PacketCommunicator communicator = OpenLiveDevice())
{
using (PacketDumpFile dumpFile = communicator.OpenDump(dumpFilename))
{
dumpFile.Dump(expectedPacket);
}
}
using (PacketCommunicator communicator = new OfflinePacketDevice(dumpFilename).Open())
{
communicator.SetFilter("ether src " + SourceMac + " and ether dst " + DestinationMac);
Packet actualPacket;
communicator.GetPacket(out actualPacket);
Assert.AreEqual(expectedPacket, actualPacket);
MoreAssert.IsInRange(expectedPacket.Timestamp.AddSeconds(-1), expectedPacket.Timestamp.AddSeconds(1),
actualPacket.Timestamp);
}
}
[TestMethod]
public void ReceiveManyPacketsTest()
{
const string SourceMac = "11:22:33:44:55:66";
const string DestinationMac = "77:88:99:AA:BB:CC";
const int NumPacketsToSend = 100;
using (PacketCommunicator communicator = OpenLiveDevice())
{
communicator.SetFilter("ether src " + SourceMac + " and ether dst " + DestinationMac);
Packet sentPacket = PacketBuilder.Ethernet(DateTime.Now,
new MacAddress(SourceMac),
new MacAddress(DestinationMac),
EthernetType.IpV4,
new Datagram(new byte[10], 0, 10));
PacketCommunicatorReceiveResult result = PacketCommunicatorReceiveResult.None;
int numPacketsGot = 0;
Thread thread = new Thread(delegate()
{
result = communicator.GetPackets(NumPacketsToSend,
delegate(Packet packet)
{
Assert.AreEqual(sentPacket, packet);
++numPacketsGot;
});
});
thread.Start();
for (int i = 0; i != NumPacketsToSend; ++i)
communicator.SendPacket(sentPacket);
if (!thread.Join(TimeSpan.FromSeconds(5)))
thread.Abort();
Assert.AreEqual(NumPacketsToSend, numPacketsGot);
Assert.AreEqual(PacketCommunicatorReceiveResult.Ok, result);
}
}
private static PacketCommunicator OpenLiveDevice()
{
IList<LivePacketDevice> devices = LivePacketDevice.AllLocalMachine;
......@@ -103,22 +178,22 @@ namespace PcapDotNet.Core.Test
Assert.AreEqual(1, device.Addresses.Count);
DeviceAddress address = device.Addresses[0];
Assert.AreEqual("Address: INET 10.0.0.2 Netmask: INET 255.0.0.0 Broadcast: INET 255.255.255.255", address.ToString());
PacketCommunicator deviceHandler = device.Open();
PacketCommunicator communicator = device.Open();
try
{
Assert.AreEqual(DataLinkKind.Ethernet, deviceHandler.DataLink.Kind);
Assert.AreEqual("EN10MB (Ethernet)", deviceHandler.DataLink.ToString());
Assert.AreEqual(deviceHandler.DataLink, new PcapDataLink(deviceHandler.DataLink.Name));
Assert.IsTrue(deviceHandler.IsFileSystemByteOrder);
Assert.AreEqual(DeviceHandlerMode.Capture, deviceHandler.Mode);
Assert.IsFalse(deviceHandler.NonBlocking);
Assert.AreEqual(PacketDevice.DefaultSnapshotLength, deviceHandler.SnapshotLength);
Assert.AreEqual(new PacketTotalStatistics(0, 0, 0, 0), deviceHandler.TotalStatistics);
return deviceHandler;
Assert.AreEqual(DataLinkKind.Ethernet, communicator.DataLink.Kind);
Assert.AreEqual("EN10MB (Ethernet)", communicator.DataLink.ToString());
Assert.AreEqual(communicator.DataLink, new PcapDataLink(communicator.DataLink.Name));
Assert.IsTrue(communicator.IsFileSystemByteOrder);
Assert.AreEqual(PacketCommunicatorMode.Capture, communicator.Mode);
Assert.IsFalse(communicator.NonBlocking);
Assert.AreEqual(PacketDevice.DefaultSnapshotLength, communicator.SnapshotLength);
Assert.AreEqual(new PacketTotalStatistics(0, 0, 0, 0), communicator.TotalStatistics);
return communicator;
}
catch (Exception)
{
deviceHandler.Dispose();
communicator.Dispose();
throw;
}
}
......
......@@ -108,12 +108,12 @@ PacketTotalStatistics^ PacketCommunicator::TotalStatistics::get()
}
DeviceHandlerMode PacketCommunicator::Mode::get()
PacketCommunicatorMode PacketCommunicator::Mode::get()
{
return _mode;
}
void PacketCommunicator::Mode::set(DeviceHandlerMode value)
void PacketCommunicator::Mode::set(PacketCommunicatorMode value)
{
if (pcap_setmode(_pcapDescriptor, safe_cast<int>(value)) < 0)
throw BuildInvalidOperation("Error setting mode " + value.ToString());
......@@ -136,15 +136,15 @@ void PacketCommunicator::NonBlocking::set(bool value)
throw gcnew InvalidOperationException("Error setting NonBlocking to " + value.ToString());
}
DeviceHandlerResult PacketCommunicator::GetPacket([Out] Packet^% packet)
PacketCommunicatorReceiveResult PacketCommunicator::GetPacket([Out] Packet^% packet)
{
AssertMode(DeviceHandlerMode::Capture);
AssertMode(PacketCommunicatorMode::Capture);
pcap_pkthdr* packetHeader;
const unsigned char* packetData;
DeviceHandlerResult result = RunPcapNextEx(&packetHeader, &packetData);
PacketCommunicatorReceiveResult result = RunPcapNextEx(&packetHeader, &packetData);
if (result != DeviceHandlerResult::Ok)
if (result != PacketCommunicatorReceiveResult::Ok)
{
packet = nullptr;
return result;
......@@ -154,9 +154,9 @@ DeviceHandlerResult PacketCommunicator::GetPacket([Out] Packet^% packet)
return result;
}
DeviceHandlerResult PacketCommunicator::GetSomePackets(int maxPackets, HandlePacket^ callBack, [Out] int% numPacketsGot)
PacketCommunicatorReceiveResult PacketCommunicator::GetSomePackets(int maxPackets, HandlePacket^ callBack, [Out] int% numPacketsGot)
{
AssertMode(DeviceHandlerMode::Capture);
AssertMode(PacketCommunicatorMode::Capture);
PacketHandler^ packetHandler = gcnew PacketHandler(callBack, DataLink);
HandlerDelegate^ packetHandlerDelegate = gcnew HandlerDelegate(packetHandler, &PacketHandler::Handle);
......@@ -170,13 +170,13 @@ DeviceHandlerResult PacketCommunicator::GetSomePackets(int maxPackets, HandlePac
if (numPacketsGot == -1)
throw BuildInvalidOperation("Failed reading from device");
if (numPacketsGot == -2)
return DeviceHandlerResult::BreakLoop;
return DeviceHandlerResult::Ok;
return PacketCommunicatorReceiveResult::BreakLoop;
return PacketCommunicatorReceiveResult::Ok;
}
DeviceHandlerResult PacketCommunicator::GetPackets(int numPackets, HandlePacket^ callBack)
PacketCommunicatorReceiveResult PacketCommunicator::GetPackets(int numPackets, HandlePacket^ callBack)
{
AssertMode(DeviceHandlerMode::Capture);
AssertMode(PacketCommunicatorMode::Capture);
PacketHandler^ packetHandler = gcnew PacketHandler(callBack, DataLink);
HandlerDelegate^ packetHandlerDelegate = gcnew HandlerDelegate(packetHandler, &PacketHandler::Handle);
......@@ -186,19 +186,19 @@ DeviceHandlerResult PacketCommunicator::GetPackets(int numPackets, HandlePacket^
if (result == -1)
throw BuildInvalidOperation("Failed reading from device");
if (result == -2)
return DeviceHandlerResult::BreakLoop;
return DeviceHandlerResult::Ok;
return PacketCommunicatorReceiveResult::BreakLoop;
return PacketCommunicatorReceiveResult::Ok;
}
DeviceHandlerResult PacketCommunicator::GetNextStatistics([Out] PacketSampleStatistics^% statistics)
PacketCommunicatorReceiveResult PacketCommunicator::GetNextStatistics([Out] PacketSampleStatistics^% statistics)
{
AssertMode(DeviceHandlerMode::Statistics);
AssertMode(PacketCommunicatorMode::Statistics);
pcap_pkthdr* packetHeader;
const unsigned char* packetData;
DeviceHandlerResult result = RunPcapNextEx(&packetHeader, &packetData);
PacketCommunicatorReceiveResult result = RunPcapNextEx(&packetHeader, &packetData);
if (result != DeviceHandlerResult::Ok)
if (result != PacketCommunicatorReceiveResult::Ok)
{
statistics = nullptr;
return result;
......@@ -279,25 +279,25 @@ PacketSampleStatistics^ PacketCommunicator::CreateStatistics(const pcap_pkthdr&
return gcnew PacketSampleStatistics(timestamp, acceptedPackets, acceptedBytes);
}
DeviceHandlerResult PacketCommunicator::RunPcapNextEx(pcap_pkthdr** packetHeader, const unsigned char** packetData)
PacketCommunicatorReceiveResult PacketCommunicator::RunPcapNextEx(pcap_pkthdr** packetHeader, const unsigned char** packetData)
{
int result = pcap_next_ex(_pcapDescriptor, packetHeader, packetData);
switch (result)
{
case -2:
return DeviceHandlerResult::Eof;
return PacketCommunicatorReceiveResult::Eof;
case -1:
throw PcapError::BuildInvalidOperation("Failed reading from device", _pcapDescriptor);
case 0:
return DeviceHandlerResult::Timeout;
return PacketCommunicatorReceiveResult::Timeout;
case 1:
return DeviceHandlerResult::Ok;
return PacketCommunicatorReceiveResult::Ok;
default:
throw gcnew InvalidOperationException("Result value " + result.ToString() + " is undefined");
}
}
void PacketCommunicator::AssertMode(DeviceHandlerMode mode)
void PacketCommunicator::AssertMode(PacketCommunicatorMode mode)
{
if (Mode != mode)
throw gcnew InvalidOperationException("Wrong Mode. Must be in mode " + mode.ToString() + " and not in mode " + Mode.ToString());
......
......@@ -11,15 +11,16 @@
namespace PcapDotNet { namespace Core
{
public enum class DeviceHandlerResult : int
public enum class PacketCommunicatorReceiveResult : int
{
Ok, // if the packet has been read without problems
Timeout, // if the timeout set with Open() has elapsed.
Eof, // if EOF was reached reading from an offline capture
BreakLoop //
Ok, // if the packet has been read without problems
Timeout, // if the timeout set with Open() has elapsed.
Eof, // if EOF was reached reading from an offline capture
BreakLoop, //
None
};
public enum class DeviceHandlerMode : int
public enum class PacketCommunicatorMode : int
{
Capture = 0x0, // Capture working mode.
Statistics = 0x1, // Statistical working mode.
......@@ -69,10 +70,10 @@ namespace PcapDotNet { namespace Core
PacketTotalStatistics^ get();
}
property DeviceHandlerMode Mode
property PacketCommunicatorMode Mode
{
DeviceHandlerMode get();
void set(DeviceHandlerMode value);
PacketCommunicatorMode get();
void set(PacketCommunicatorMode value);
}
property bool NonBlocking
......@@ -82,12 +83,12 @@ namespace PcapDotNet { namespace Core
}
delegate void HandlePacket(Packets::Packet^ packet);
DeviceHandlerResult GetPacket([System::Runtime::InteropServices::Out] Packets::Packet^% packet);
DeviceHandlerResult GetSomePackets(int maxPackets, HandlePacket^ callBack, [System::Runtime::InteropServices::Out] int% numPacketsGot);
DeviceHandlerResult GetPackets(int numPackets, HandlePacket^ callBack);
PacketCommunicatorReceiveResult GetPacket([System::Runtime::InteropServices::Out] Packets::Packet^% packet);
PacketCommunicatorReceiveResult GetSomePackets(int maxPackets, HandlePacket^ callBack, [System::Runtime::InteropServices::Out] int% numPacketsGot);
PacketCommunicatorReceiveResult GetPackets(int numPackets, HandlePacket^ callBack);
delegate void HandleStatistics(PacketSampleStatistics^ statistics);
DeviceHandlerResult GetNextStatistics([System::Runtime::InteropServices::Out] PacketSampleStatistics^% statistics);
PacketCommunicatorReceiveResult GetNextStatistics([System::Runtime::InteropServices::Out] PacketSampleStatistics^% statistics);
void SendPacket(Packets::Packet^ packet);
void Transmit(PacketSendQueue^ sendQueue, bool isSync);
......@@ -104,12 +105,12 @@ namespace PcapDotNet { namespace Core
static Packets::Packet^ CreatePacket(const pcap_pkthdr& packetHeader, const unsigned char* packetData, Packets::IDataLink^ dataLink);
static PacketSampleStatistics^ PacketCommunicator::CreateStatistics(const pcap_pkthdr& packetHeader, const unsigned char* packetData);
DeviceHandlerResult RunPcapNextEx(pcap_pkthdr** packetHeader, const unsigned char** packetData);
PacketCommunicatorReceiveResult RunPcapNextEx(pcap_pkthdr** packetHeader, const unsigned char** packetData);
[System::Runtime::InteropServices::UnmanagedFunctionPointer(System::Runtime::InteropServices::CallingConvention::Cdecl)]
delegate void HandlerDelegate(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData);
void AssertMode(DeviceHandlerMode mode);
void AssertMode(PacketCommunicatorMode mode);
property System::String^ ErrorMessage
{
......@@ -149,6 +150,6 @@ namespace PcapDotNet { namespace Core
private:
pcap_t* _pcapDescriptor;
IpV4SocketAddress^ _ipV4Netmask;
DeviceHandlerMode _mode;
PacketCommunicatorMode _mode;
};
}}
\ No newline at end of file
#include "PacketTotalStatistics.h"
using namespace System;
using namespace System::Text;
using namespace PcapDotNet::Core;
PacketTotalStatistics::PacketTotalStatistics(unsigned int packetsReceived, unsigned int packetsDroppedByDriver, unsigned int packetsDroppedByInterface, unsigned int packetsCaptured)
......@@ -45,3 +47,17 @@ bool PacketTotalStatistics::Equals(Object^ other)
{
return Equals(dynamic_cast<PacketTotalStatistics^>(other));
}
String^ PacketTotalStatistics::ToString()
{
StringBuilder^ stringBuilder = gcnew StringBuilder();
stringBuilder->Append("Packets Received: ");
stringBuilder->Append(PacketsReceived);
stringBuilder->Append("Packets Dropped By Driver: ");
stringBuilder->Append(PacketsDroppedByDriver);
stringBuilder->Append("Packets Dropped By Interface: ");
stringBuilder->Append(PacketsDroppedByInterface);
stringBuilder->Append("Packets Captured: ");
stringBuilder->Append(PacketsCaptured);
return stringBuilder->ToString();
}
\ No newline at end of file
......@@ -2,7 +2,7 @@
namespace PcapDotNet { namespace Core
{
public ref class PacketTotalStatistics
public ref class PacketTotalStatistics : System::IEquatable<PacketTotalStatistics^>
{
public:
PacketTotalStatistics(unsigned int packetsReceived, unsigned int packetsDroppedByDriver, unsigned int packetsDroppedByInterface, unsigned int packetsCaptured);
......@@ -27,9 +27,11 @@ namespace PcapDotNet { namespace Core
unsigned int get();
}
bool Equals(PacketTotalStatistics^ other);
virtual bool Equals(PacketTotalStatistics^ other);
virtual bool Equals(System::Object^ other) override;
virtual System::String^ ToString() override;
private:
unsigned int _packetsReceived;
unsigned int _packetsDroppedByDriver;
......
......@@ -15,7 +15,8 @@ void Timestamp::PcapTimestampToDateTime(const timeval& pcapTimestamp, [System::R
// static
void Timestamp::DateTimeToPcapTimestamp(System::DateTime dateTime, timeval& pcapTimestamp)
{
TimeSpan timespan = dateTime - DateTime(1970,1,1, 0, 0, 0, DateTimeKind::Utc);
dateTime = dateTime.ToUniversalTime();
TimeSpan timespan = dateTime - DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind::Utc);
pcapTimestamp.tv_sec = (long)timespan.TotalSeconds;
pcapTimestamp.tv_usec = (long)(timespan.Milliseconds * 1000);
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment