SharpPCap丢失数据包

时间:2013-03-14 09:26:14

标签: wireshark missing-data sharppcap

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

你的例子好像是在尾部包裹着圆形缓冲区。什么类型的circularBuffer?在缓冲区填满之前,您如何确定正在处理数据包?

您是否看过SharpPcap源代码发布中的这个示例,该示例显示了一种进行后台数据包处理的技术?

QueueingPacketsForBackgroundProcessing/Main.cs