我使用SharpPCap通过以太网收集IEC61850-9-2LE采样值。IEC61850-9-2LE采样值由多个流组成,每个流每秒发送4000个数据包,其中平均数据包大小为125字节。
使用SharpPCap,我尝试收集其中的3个流(每秒3x4000个包-每个包125字节)。
在下面的代码中,我设置了网卡。
if (nicToUse != null)
{
try
{
nicToUse.OnPacketArrival -= OnPackectArrivalLive;
nicToUse.OnPacketArrival += OnPackectArrivalLive;
try
{
if (nicToUse.Started)
nicToUse.StopCapture();
if (nicToUse.Opened)
nicToUse.Close();
}
catch (Exception)
{
//no handling, just do it.
}
nicToUse.Open(OpenFlags.Promiscuous|OpenFlags.MaxResponsiveness,10);
var kernelBufferAssigned = false;
uint kernelBufferSize = 200;
while (!kernelBufferAssigned)
{
try
{
nicToUse.KernelBufferSize = kernelBufferSize * 1024 * 1024;
kernelBufferAssigned = true;
}
catch (Exception)
{
kernelBufferSize--;
}
}
nicToUse.Filter = "(ether[0:4] = 0x010CCD04)";
watchdog.Enabled = true;
counter = 0;
nicToUse.StartCapture();
}
catch (Exception ex)
{
throw new Exception(Resources.SharpPCapPacketsProducer_Start_Error_while_starting_online_capture_, ex);
}
}这是OnPacketArrival事件处理程序:
private void OnPackectArrivalLive(object sender, CaptureEventArgs e)
{
try
{
counter++;
circularBuffer[circularBufferIndex] = e.Packet;
circularBufferIndex++;
if (circularBufferIndex > circularBufferSize - 1)
circularBufferIndex = 0;
}
catch (Exception)
{
}
}当捕获结束时(用户停止捕获),捕获的数据包被解码,由于它们持有顺序计数器,我发现一些样本丢失了。
如果将同一信号源连接到另一台运行Wireshark的PC,则不会丢失这些示例。
有什么想法吗?
发布于 2013-03-14 21:21:17
您使用的是什么版本的SharpPcap?由于3.x和4.x系列中的开销减少,已经有了相当大的性能改进。
您的示例似乎在尾部包装了循环缓冲区。circularBuffer是什么类型的?您如何确定在缓冲区填满之前正在处理数据包?
您看过这个来自SharpPcap源代码发行版的示例吗?它展示了一种进行后台数据包处理的技术。
QueueingPacketsForBackgroundProcessing/Main.cs
https://stackoverflow.com/questions/15405427
复制相似问题