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,這些示例不會丟失。
有什麼想法?
Ciao Chris,感謝您的支持。 我目前正在使用4.1.0.0 – 2013-03-14 14:05:30
循環緩衝區正在環繞尾部,因爲我只想處理有限且固定數量的數據包。 private RawCapture [] circularBuffer; 我不*解碼數據包,然後將它們放入緩衝區,但我只是將它們全部收集起來。 我想我明白了你的觀點:由於循環緩衝,我不會丟失數據包。我只想收集最後的500000個數據包。當用戶停下來時,他想確定他將只處理最後的500000個數據包。 – 2013-03-14 14:21:01
事實是,屬於單個流的每個分組具有從0到3999的計數器:因此,例如,屬於流A的分組可以具有計數器#2333,並且流A的下一個分組將具有計數器#2334。 對數據包解碼後,我意識到我從2333跳到2347. 我希望它已經足夠清楚。 你的例子很棒,但我不需要「在線解碼」,在捕獲時把數據包存儲在某個地方並在之後處理它們是很好的。 我希望我很清楚。 – 2013-03-14 14:23:06