2013-03-14 99 views
1

我使用SharpPCap通過以太網收集IEC61850-9-2LE採樣值。 IEC61850-9-2LE採樣值由多個數據流組成,每個數據流每秒發送4000個數據包,其中平均數據包大小爲125個字節。SharpPCap丟失數據包

使用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

您使用的是什麼版本的SharpPcap?由於3.x和4.x系列的開銷減少,性能有了很大提升。

您的示例似乎是將環形緩衝區環繞在尾部。 circularBuffer是什麼類型?您如何確定在緩衝區填滿之前處理數據包?

您是否看過SharpPcap源代碼發行版中的這個示例,該示例顯示了一種用於執行後臺數據包處理的技術?

QueueingPacketsForBackgroundProcessing/Main.cs

+0

Ciao Chris,感謝您的支持。 我目前正在使用4.1.0.0 – 2013-03-14 14:05:30

+0

循環緩衝區正在環繞尾部,因爲我只想處理有限且固定數量的數據包。 private RawCapture [] circularBuffer; 我不*解碼數據包,然後將它們放入緩衝區,但我只是將它們全部收集起來。 我想我明白了你的觀點:由於循環緩衝,我不會丟失數據包。我只想收集最後的500000個數據包。當用戶停下來時,他想確定他將只處理最後的500000個數據包。 – 2013-03-14 14:21:01

+0

事實是,屬於單個流的每個分組具有從0到3999的計數器:因此,例如,屬於流A的分組可以具有計數器#2333,並且流A的下一個分組將具有計數器#2334。 對數據包解碼後,我意識到我從2333跳到2347. 我希望它已經足夠清楚。 你的例子很棒,但我不需要「在線解碼」,在捕獲時把數據包存儲在某個地方並在之後處理它們是很好的。 我希望我很清楚。 – 2013-03-14 14:23:06