1

我正在使用 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,这些示例不会丢失。

任何想法 ?

4

1 回答 1

1

您使用的是什么版本的 SharpPcap?由于 3.x 和 4.x 系列的开销减少,性能有了一些相当大的改进。

您的示例似乎将循环缓冲区包裹在尾部。循环缓冲区是什么类型的?您如何确定在缓冲区填满之前正在处理数据包?

您是否看过这个来自 SharpPcap 源代码分发的示例,它展示了一种用于进行后台数据包处理的技术?

QueueingPacketsForBackgroundProcessing/Main.cs

于 2013-03-14T13:21:17.067 回答