我正在使用SharpPCap通过以太网收集IEC61850-9-2LE采样值。 IEC61850-9-2LE Sampled值由几个流组成,每个流每秒发送4000个数据包,其中avg数据包大小为125个字节。
使用SharpPCap我试图收集其中3个流(每秒3x4000个数据包 - 每个125bytes)。
在以下代码中,我设置了网络接口卡。
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,这些样本不会丢失。
有什么想法吗?
答案 0 :(得分:1)
您使用的是什么版本的SharpPcap?由于3.x和4.x系列的开销减少,已经有一些非常大的性能改进。
你的例子好像是在尾部包裹着圆形缓冲区。什么类型的circularBuffer?在缓冲区填满之前,您如何确定正在处理数据包?
您是否看过SharpPcap源代码发布中的这个示例,该示例显示了一种进行后台数据包处理的技术?