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; ...@@ -5,7 +5,7 @@ using System.Text;
namespace Packets namespace Packets
{ {
public class Packet public class Packet : IEquatable<Packet>
{ {
public Packet(byte[] data, DateTime timestamp, IDataLink dataLink) public Packet(byte[] data, DateTime timestamp, IDataLink dataLink)
{ {
...@@ -14,6 +14,11 @@ namespace Packets ...@@ -14,6 +14,11 @@ namespace Packets
_dataLink = dataLink; _dataLink = dataLink;
} }
public byte this[int offset]
{
get { return _data[offset]; }
}
public int Length public int Length
{ {
get { return _data.Length; } get { return _data.Length; }
...@@ -34,6 +39,24 @@ namespace Packets ...@@ -34,6 +39,24 @@ namespace Packets
get { return _data; } 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 byte[] _data;
private readonly DateTime _timestamp; private readonly DateTime _timestamp;
private readonly IDataLink _dataLink; private readonly IDataLink _dataLink;
......
...@@ -90,19 +90,19 @@ namespace WinPcapDotNet.Console ...@@ -90,19 +90,19 @@ namespace WinPcapDotNet.Console
using (PacketCommunicator deviceHandler = device.Open()) using (PacketCommunicator deviceHandler = device.Open())
{ {
deviceHandler.SetFilter(filter); deviceHandler.SetFilter(filter);
deviceHandler.Mode = DeviceHandlerMode.Statistics; deviceHandler.Mode = PacketCommunicatorMode.Statistics;
for (int i = 0; i != 10; ++i) for (int i = 0; i != 10; ++i)
{ {
PacketSampleStatistics statistics; PacketSampleStatistics statistics;
DeviceHandlerResult result = deviceHandler.GetNextStatistics(out statistics); PacketCommunicatorReceiveResult result = deviceHandler.GetNextStatistics(out statistics);
switch (result) switch (result)
{ {
case DeviceHandlerResult.Ok: case PacketCommunicatorReceiveResult.Ok:
break; break;
case DeviceHandlerResult.Timeout: case PacketCommunicatorReceiveResult.Timeout:
continue; continue;
case DeviceHandlerResult.Eof: case PacketCommunicatorReceiveResult.Eof:
continue; continue;
} }
...@@ -121,14 +121,14 @@ namespace WinPcapDotNet.Console ...@@ -121,14 +121,14 @@ namespace WinPcapDotNet.Console
for (int i = 0; i != 100; ++i) for (int i = 0; i != 100; ++i)
{ {
Packet packet; Packet packet;
DeviceHandlerResult result = offlineHandler.GetPacket(out packet); PacketCommunicatorReceiveResult result = offlineHandler.GetPacket(out packet);
switch (result) switch (result)
{ {
case DeviceHandlerResult.Ok: case PacketCommunicatorReceiveResult.Ok:
break; break;
case DeviceHandlerResult.Timeout: case PacketCommunicatorReceiveResult.Timeout:
continue; continue;
case DeviceHandlerResult.Eof: case PacketCommunicatorReceiveResult.Eof:
continue; continue;
} }
...@@ -153,14 +153,14 @@ namespace WinPcapDotNet.Console ...@@ -153,14 +153,14 @@ namespace WinPcapDotNet.Console
for (int i = 0; i != 100; ++i) for (int i = 0; i != 100; ++i)
{ {
Packet packet; Packet packet;
DeviceHandlerResult result = offlineHandler.GetPacket(out packet); PacketCommunicatorReceiveResult result = offlineHandler.GetPacket(out packet);
switch (result) switch (result)
{ {
case DeviceHandlerResult.Ok: case PacketCommunicatorReceiveResult.Ok:
break; break;
case DeviceHandlerResult.Timeout: case PacketCommunicatorReceiveResult.Timeout:
continue; continue;
case DeviceHandlerResult.Eof: case PacketCommunicatorReceiveResult.Eof:
continue; continue;
} }
...@@ -179,14 +179,14 @@ namespace WinPcapDotNet.Console ...@@ -179,14 +179,14 @@ namespace WinPcapDotNet.Console
for (int i = 0; i != 100; ++i) for (int i = 0; i != 100; ++i)
{ {
Packet packet; Packet packet;
DeviceHandlerResult result = liveHandler.GetPacket(out packet); PacketCommunicatorReceiveResult result = liveHandler.GetPacket(out packet);
switch (result) switch (result)
{ {
case DeviceHandlerResult.Ok: case PacketCommunicatorReceiveResult.Ok:
break; break;
case DeviceHandlerResult.Timeout: case PacketCommunicatorReceiveResult.Timeout:
continue; continue;
case DeviceHandlerResult.Eof: case PacketCommunicatorReceiveResult.Eof:
continue; continue;
} }
......
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Threading; using System.Threading;
using Packets; using Packets;
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.VisualStudio.TestTools.UnitTesting;
...@@ -66,9 +67,9 @@ namespace PcapDotNet.Core.Test ...@@ -66,9 +67,9 @@ namespace PcapDotNet.Core.Test
const string DestinationMac = "77:88:99:AA:BB:CC"; const string DestinationMac = "77:88:99:AA:BB:CC";
const int NumPacketsToSend = 10; 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, Packet sentPacket = PacketBuilder.Ethernet(DateTime.Now,
new MacAddress(SourceMac), new MacAddress(SourceMac),
...@@ -79,20 +80,94 @@ namespace PcapDotNet.Core.Test ...@@ -79,20 +80,94 @@ namespace PcapDotNet.Core.Test
DateTime startSendingTime = DateTime.Now; DateTime startSendingTime = DateTime.Now;
for (int i = 0; i != NumPacketsToSend; ++i) for (int i = 0; i != NumPacketsToSend; ++i)
deviceHandler.SendPacket(sentPacket); communicator.SendPacket(sentPacket);
DateTime endSendingTime = DateTime.Now; DateTime endSendingTime = DateTime.Now;
Packet packet; Packet packet;
DeviceHandlerResult result = deviceHandler.GetPacket(out packet); PacketCommunicatorReceiveResult result = communicator.GetPacket(out packet);
Assert.AreEqual(DeviceHandlerResult.Ok, result); Assert.AreEqual(PacketCommunicatorReceiveResult.Ok, result);
Assert.AreEqual<uint>(NumPacketsToSend, deviceHandler.TotalStatistics.PacketsCaptured); Assert.AreEqual<uint>(NumPacketsToSend, communicator.TotalStatistics.PacketsCaptured);
Assert.AreEqual(sentPacket.Length, packet.Length); Assert.AreEqual(sentPacket.Length, packet.Length);
MoreAssert.IsInRange(startSendingTime - TimeSpan.FromSeconds(1), endSendingTime + TimeSpan.FromSeconds(30), packet.Timestamp); 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() private static PacketCommunicator OpenLiveDevice()
{ {
IList<LivePacketDevice> devices = LivePacketDevice.AllLocalMachine; IList<LivePacketDevice> devices = LivePacketDevice.AllLocalMachine;
...@@ -103,22 +178,22 @@ namespace PcapDotNet.Core.Test ...@@ -103,22 +178,22 @@ namespace PcapDotNet.Core.Test
Assert.AreEqual(1, device.Addresses.Count); Assert.AreEqual(1, device.Addresses.Count);
DeviceAddress address = device.Addresses[0]; 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()); 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 try
{ {
Assert.AreEqual(DataLinkKind.Ethernet, deviceHandler.DataLink.Kind); Assert.AreEqual(DataLinkKind.Ethernet, communicator.DataLink.Kind);
Assert.AreEqual("EN10MB (Ethernet)", deviceHandler.DataLink.ToString()); Assert.AreEqual("EN10MB (Ethernet)", communicator.DataLink.ToString());
Assert.AreEqual(deviceHandler.DataLink, new PcapDataLink(deviceHandler.DataLink.Name)); Assert.AreEqual(communicator.DataLink, new PcapDataLink(communicator.DataLink.Name));
Assert.IsTrue(deviceHandler.IsFileSystemByteOrder); Assert.IsTrue(communicator.IsFileSystemByteOrder);
Assert.AreEqual(DeviceHandlerMode.Capture, deviceHandler.Mode); Assert.AreEqual(PacketCommunicatorMode.Capture, communicator.Mode);
Assert.IsFalse(deviceHandler.NonBlocking); Assert.IsFalse(communicator.NonBlocking);
Assert.AreEqual(PacketDevice.DefaultSnapshotLength, deviceHandler.SnapshotLength); Assert.AreEqual(PacketDevice.DefaultSnapshotLength, communicator.SnapshotLength);
Assert.AreEqual(new PacketTotalStatistics(0, 0, 0, 0), deviceHandler.TotalStatistics); Assert.AreEqual(new PacketTotalStatistics(0, 0, 0, 0), communicator.TotalStatistics);
return deviceHandler; return communicator;
} }
catch (Exception) catch (Exception)
{ {
deviceHandler.Dispose(); communicator.Dispose();
throw; throw;
} }
} }
......
...@@ -108,12 +108,12 @@ PacketTotalStatistics^ PacketCommunicator::TotalStatistics::get() ...@@ -108,12 +108,12 @@ PacketTotalStatistics^ PacketCommunicator::TotalStatistics::get()
} }
DeviceHandlerMode PacketCommunicator::Mode::get() PacketCommunicatorMode PacketCommunicator::Mode::get()
{ {
return _mode; return _mode;
} }
void PacketCommunicator::Mode::set(DeviceHandlerMode value) void PacketCommunicator::Mode::set(PacketCommunicatorMode value)
{ {
if (pcap_setmode(_pcapDescriptor, safe_cast<int>(value)) < 0) if (pcap_setmode(_pcapDescriptor, safe_cast<int>(value)) < 0)
throw BuildInvalidOperation("Error setting mode " + value.ToString()); throw BuildInvalidOperation("Error setting mode " + value.ToString());
...@@ -136,15 +136,15 @@ void PacketCommunicator::NonBlocking::set(bool value) ...@@ -136,15 +136,15 @@ void PacketCommunicator::NonBlocking::set(bool value)
throw gcnew InvalidOperationException("Error setting NonBlocking to " + value.ToString()); 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; pcap_pkthdr* packetHeader;
const unsigned char* packetData; const unsigned char* packetData;
DeviceHandlerResult result = RunPcapNextEx(&packetHeader, &packetData); PacketCommunicatorReceiveResult result = RunPcapNextEx(&packetHeader, &packetData);
if (result != DeviceHandlerResult::Ok) if (result != PacketCommunicatorReceiveResult::Ok)
{ {
packet = nullptr; packet = nullptr;
return result; return result;
...@@ -154,9 +154,9 @@ DeviceHandlerResult PacketCommunicator::GetPacket([Out] Packet^% packet) ...@@ -154,9 +154,9 @@ DeviceHandlerResult PacketCommunicator::GetPacket([Out] Packet^% packet)
return result; 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); PacketHandler^ packetHandler = gcnew PacketHandler(callBack, DataLink);
HandlerDelegate^ packetHandlerDelegate = gcnew HandlerDelegate(packetHandler, &PacketHandler::Handle); HandlerDelegate^ packetHandlerDelegate = gcnew HandlerDelegate(packetHandler, &PacketHandler::Handle);
...@@ -170,13 +170,13 @@ DeviceHandlerResult PacketCommunicator::GetSomePackets(int maxPackets, HandlePac ...@@ -170,13 +170,13 @@ DeviceHandlerResult PacketCommunicator::GetSomePackets(int maxPackets, HandlePac
if (numPacketsGot == -1) if (numPacketsGot == -1)
throw BuildInvalidOperation("Failed reading from device"); throw BuildInvalidOperation("Failed reading from device");
if (numPacketsGot == -2) if (numPacketsGot == -2)
return DeviceHandlerResult::BreakLoop; return PacketCommunicatorReceiveResult::BreakLoop;
return DeviceHandlerResult::Ok; 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); PacketHandler^ packetHandler = gcnew PacketHandler(callBack, DataLink);
HandlerDelegate^ packetHandlerDelegate = gcnew HandlerDelegate(packetHandler, &PacketHandler::Handle); HandlerDelegate^ packetHandlerDelegate = gcnew HandlerDelegate(packetHandler, &PacketHandler::Handle);
...@@ -186,19 +186,19 @@ DeviceHandlerResult PacketCommunicator::GetPackets(int numPackets, HandlePacket^ ...@@ -186,19 +186,19 @@ DeviceHandlerResult PacketCommunicator::GetPackets(int numPackets, HandlePacket^
if (result == -1) if (result == -1)
throw BuildInvalidOperation("Failed reading from device"); throw BuildInvalidOperation("Failed reading from device");
if (result == -2) if (result == -2)
return DeviceHandlerResult::BreakLoop; return PacketCommunicatorReceiveResult::BreakLoop;
return DeviceHandlerResult::Ok; return PacketCommunicatorReceiveResult::Ok;
} }
DeviceHandlerResult PacketCommunicator::GetNextStatistics([Out] PacketSampleStatistics^% statistics) PacketCommunicatorReceiveResult PacketCommunicator::GetNextStatistics([Out] PacketSampleStatistics^% statistics)
{ {
AssertMode(DeviceHandlerMode::Statistics); AssertMode(PacketCommunicatorMode::Statistics);
pcap_pkthdr* packetHeader; pcap_pkthdr* packetHeader;
const unsigned char* packetData; const unsigned char* packetData;
DeviceHandlerResult result = RunPcapNextEx(&packetHeader, &packetData); PacketCommunicatorReceiveResult result = RunPcapNextEx(&packetHeader, &packetData);
if (result != DeviceHandlerResult::Ok) if (result != PacketCommunicatorReceiveResult::Ok)
{ {
statistics = nullptr; statistics = nullptr;
return result; return result;
...@@ -279,25 +279,25 @@ PacketSampleStatistics^ PacketCommunicator::CreateStatistics(const pcap_pkthdr& ...@@ -279,25 +279,25 @@ PacketSampleStatistics^ PacketCommunicator::CreateStatistics(const pcap_pkthdr&
return gcnew PacketSampleStatistics(timestamp, acceptedPackets, acceptedBytes); 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); int result = pcap_next_ex(_pcapDescriptor, packetHeader, packetData);
switch (result) switch (result)
{ {
case -2: case -2:
return DeviceHandlerResult::Eof; return PacketCommunicatorReceiveResult::Eof;
case -1: case -1:
throw PcapError::BuildInvalidOperation("Failed reading from device", _pcapDescriptor); throw PcapError::BuildInvalidOperation("Failed reading from device", _pcapDescriptor);
case 0: case 0:
return DeviceHandlerResult::Timeout; return PacketCommunicatorReceiveResult::Timeout;
case 1: case 1:
return DeviceHandlerResult::Ok; return PacketCommunicatorReceiveResult::Ok;
default: default:
throw gcnew InvalidOperationException("Result value " + result.ToString() + " is undefined"); throw gcnew InvalidOperationException("Result value " + result.ToString() + " is undefined");
} }
} }
void PacketCommunicator::AssertMode(DeviceHandlerMode mode) void PacketCommunicator::AssertMode(PacketCommunicatorMode mode)
{ {
if (Mode != mode) if (Mode != mode)
throw gcnew InvalidOperationException("Wrong Mode. Must be in mode " + mode.ToString() + " and not in mode " + Mode.ToString()); throw gcnew InvalidOperationException("Wrong Mode. Must be in mode " + mode.ToString() + " and not in mode " + Mode.ToString());
......
...@@ -11,15 +11,16 @@ ...@@ -11,15 +11,16 @@
namespace PcapDotNet { namespace Core namespace PcapDotNet { namespace Core
{ {
public enum class DeviceHandlerResult : int public enum class PacketCommunicatorReceiveResult : int
{ {
Ok, // if the packet has been read without problems Ok, // if the packet has been read without problems
Timeout, // if the timeout set with Open() has elapsed. Timeout, // if the timeout set with Open() has elapsed.
Eof, // if EOF was reached reading from an offline capture Eof, // if EOF was reached reading from an offline capture
BreakLoop // BreakLoop, //
None
}; };
public enum class DeviceHandlerMode : int public enum class PacketCommunicatorMode : int
{ {
Capture = 0x0, // Capture working mode. Capture = 0x0, // Capture working mode.
Statistics = 0x1, // Statistical working mode. Statistics = 0x1, // Statistical working mode.
...@@ -69,10 +70,10 @@ namespace PcapDotNet { namespace Core ...@@ -69,10 +70,10 @@ namespace PcapDotNet { namespace Core
PacketTotalStatistics^ get(); PacketTotalStatistics^ get();
} }
property DeviceHandlerMode Mode property PacketCommunicatorMode Mode
{ {
DeviceHandlerMode get(); PacketCommunicatorMode get();
void set(DeviceHandlerMode value); void set(PacketCommunicatorMode value);
} }
property bool NonBlocking property bool NonBlocking
...@@ -82,12 +83,12 @@ namespace PcapDotNet { namespace Core ...@@ -82,12 +83,12 @@ namespace PcapDotNet { namespace Core
} }
delegate void HandlePacket(Packets::Packet^ packet); delegate void HandlePacket(Packets::Packet^ packet);
DeviceHandlerResult GetPacket([System::Runtime::InteropServices::Out] Packets::Packet^% packet); PacketCommunicatorReceiveResult GetPacket([System::Runtime::InteropServices::Out] Packets::Packet^% packet);
DeviceHandlerResult GetSomePackets(int maxPackets, HandlePacket^ callBack, [System::Runtime::InteropServices::Out] int% numPacketsGot); PacketCommunicatorReceiveResult GetSomePackets(int maxPackets, HandlePacket^ callBack, [System::Runtime::InteropServices::Out] int% numPacketsGot);
DeviceHandlerResult GetPackets(int numPackets, HandlePacket^ callBack); PacketCommunicatorReceiveResult GetPackets(int numPackets, HandlePacket^ callBack);
delegate void HandleStatistics(PacketSampleStatistics^ statistics); 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 SendPacket(Packets::Packet^ packet);
void Transmit(PacketSendQueue^ sendQueue, bool isSync); void Transmit(PacketSendQueue^ sendQueue, bool isSync);
...@@ -104,12 +105,12 @@ namespace PcapDotNet { namespace Core ...@@ -104,12 +105,12 @@ namespace PcapDotNet { namespace Core
static Packets::Packet^ CreatePacket(const pcap_pkthdr& packetHeader, const unsigned char* packetData, Packets::IDataLink^ dataLink); 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); 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)] [System::Runtime::InteropServices::UnmanagedFunctionPointer(System::Runtime::InteropServices::CallingConvention::Cdecl)]
delegate void HandlerDelegate(unsigned char *user, const struct pcap_pkthdr *packetHeader, const unsigned char *packetData); 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 property System::String^ ErrorMessage
{ {
...@@ -149,6 +150,6 @@ namespace PcapDotNet { namespace Core ...@@ -149,6 +150,6 @@ namespace PcapDotNet { namespace Core
private: private:
pcap_t* _pcapDescriptor; pcap_t* _pcapDescriptor;
IpV4SocketAddress^ _ipV4Netmask; IpV4SocketAddress^ _ipV4Netmask;
DeviceHandlerMode _mode; PacketCommunicatorMode _mode;
}; };
}} }}
\ No newline at end of file
#include "PacketTotalStatistics.h" #include "PacketTotalStatistics.h"
using namespace System;
using namespace System::Text;
using namespace PcapDotNet::Core; using namespace PcapDotNet::Core;
PacketTotalStatistics::PacketTotalStatistics(unsigned int packetsReceived, unsigned int packetsDroppedByDriver, unsigned int packetsDroppedByInterface, unsigned int packetsCaptured) PacketTotalStatistics::PacketTotalStatistics(unsigned int packetsReceived, unsigned int packetsDroppedByDriver, unsigned int packetsDroppedByInterface, unsigned int packetsCaptured)
...@@ -45,3 +47,17 @@ bool PacketTotalStatistics::Equals(Object^ other) ...@@ -45,3 +47,17 @@ bool PacketTotalStatistics::Equals(Object^ other)
{ {
return Equals(dynamic_cast<PacketTotalStatistics^>(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 @@ ...@@ -2,7 +2,7 @@
namespace PcapDotNet { namespace Core namespace PcapDotNet { namespace Core
{ {
public ref class PacketTotalStatistics public ref class PacketTotalStatistics : System::IEquatable<PacketTotalStatistics^>
{ {
public: public:
PacketTotalStatistics(unsigned int packetsReceived, unsigned int packetsDroppedByDriver, unsigned int packetsDroppedByInterface, unsigned int packetsCaptured); PacketTotalStatistics(unsigned int packetsReceived, unsigned int packetsDroppedByDriver, unsigned int packetsDroppedByInterface, unsigned int packetsCaptured);
...@@ -27,9 +27,11 @@ namespace PcapDotNet { namespace Core ...@@ -27,9 +27,11 @@ namespace PcapDotNet { namespace Core
unsigned int get(); unsigned int get();
} }
bool Equals(PacketTotalStatistics^ other); virtual bool Equals(PacketTotalStatistics^ other);
virtual bool Equals(System::Object^ other) override; virtual bool Equals(System::Object^ other) override;
virtual System::String^ ToString() override;
private: private:
unsigned int _packetsReceived; unsigned int _packetsReceived;
unsigned int _packetsDroppedByDriver; unsigned int _packetsDroppedByDriver;
......
...@@ -15,7 +15,8 @@ void Timestamp::PcapTimestampToDateTime(const timeval& pcapTimestamp, [System::R ...@@ -15,7 +15,8 @@ void Timestamp::PcapTimestampToDateTime(const timeval& pcapTimestamp, [System::R
// static // static
void Timestamp::DateTimeToPcapTimestamp(System::DateTime dateTime, timeval& pcapTimestamp) 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_sec = (long)timespan.TotalSeconds;
pcapTimestamp.tv_usec = (long)(timespan.Milliseconds * 1000); 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