이더넷을 통해 IEC61850-9-2LE 샘플 값을 수집하기 위해 SharpPCap을 사용하고 있습니다. IEC61850-9-2LE 샘플링 된 값은 여러 스트림으로 구성되며 각 스트림은 평균 패킷 크기가 125 바이트 인 초당 4000 패킷을 전송합니다.SharpPCap 패킷이 누락되었습니다
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에 연결하면 해당 샘플이 누락되지 않습니다.
아이디어가 있으십니까?
Ciao Chris, 지원해 주셔서 감사합니다. 현재 4.1.0.0을 사용 중입니다. –
원형 버퍼는 꼬리 주위를 감싸고 있습니다. 왜냐하면 제한적이고 고정 된 수의 패킷 만 처리하기를 원하기 때문입니다. private RawCapture [] circularBuffer; 패킷을 버퍼에 넣기 전에 패킷을 디코딩하지는 않았지만 모두 수집하고 있습니다. 나는 당신에게 요점을 가지고 있다고 생각합니다 : 나는 원형 버퍼 때문에 패킷을 잃지 않을 것입니다. 나는 마지막 500,000 패킷만을 수집하려고합니다. 사용자가 멈 추면 그는 마지막 500,000 패킷 만 처리 할 것입니다. –
사실 단일 스트림에 속한 각 패킷은 0에서 3999 사이의 카운터를가집니다. 예를 들어 스트림 A에 속한 패킷은 카운터 # 2333을 가질 수 있으며 스트림 A의 다음 패킷은 카운터 # 2334. 패킷을 디코딩 한 후, 즉 2333에서 2347로 건너 뛰는 것을 깨달았습니다. 충분히 명확했으면합니다. 예제가 훌륭하지만 "온라인 디코딩"이 필요하지 않습니다. 캡쳐하는 동안 패킷을 저장하고 처리하는 것이 좋습니다. 나는 충분히 명확했으면 좋겠다. –