首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SharpPCap丢失的数据包

SharpPCap丢失的数据包
EN

Stack Overflow用户
提问于 2013-03-14 17:26:14
回答 1查看 1K关注 0票数 1

我使用SharpPCap通过以太网收集IEC61850-9-2LE采样值。IEC61850-9-2LE采样值由多个流组成,每个流每秒发送4000个数据包,其中平均数据包大小为125字节。

使用SharpPCap,我尝试收集其中的3个流(每秒3x4000个包-每个包125字节)。

在下面的代码中,我设置了网卡。

代码语言:javascript
复制
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事件处理程序:

代码语言:javascript
复制
private void OnPackectArrivalLive(object sender, CaptureEventArgs e)
      {
         try
         {
            counter++;
            circularBuffer[circularBufferIndex] = e.Packet;
            circularBufferIndex++;

            if (circularBufferIndex > circularBufferSize - 1)
               circularBufferIndex = 0;

         }
         catch (Exception)
         {

         }
      }

当捕获结束时(用户停止捕获),捕获的数据包被解码,由于它们持有顺序计数器,我发现一些样本丢失了。

如果将同一信号源连接到另一台运行Wireshark的PC,则不会丢失这些示例。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2013-03-14 21:21:17

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

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

您看过这个来自SharpPcap源代码发行版的示例吗?它展示了一种进行后台数据包处理的技术。

QueueingPacketsForBackgroundProcessing/Main.cs

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15405427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档