2013-03-14 4 views
1

이더넷을 통해 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에 연결하면 해당 샘플이 누락되지 않습니다.

아이디어가 있으십니까?

답변

1

어떤 SharpPcap 버전을 사용하고 있습니까? 3.x 및 4.x 시리즈의 오버 헤드 감소로 인해 상당한 성능 향상이있었습니다.

귀하의 예제는 꼬리 부분에 원형 버퍼를 감싸고있는 것 같습니다. circularBuffer는 어떤 타입입니까? 버퍼가 채워지기 전에 패킷을 어떻게 처리하고 있습니까?

SharpPcap 소스 배포에서 백그라운드 패킷 처리를 수행하는 한 가지 기술을 보여주는이 예제를 보았습니까?

QueueingPacketsForBackgroundProcessing/Main.cs

+0

Ciao Chris, 지원해 주셔서 감사합니다. 현재 4.1.0.0을 사용 중입니다. –

+0

원형 버퍼는 꼬리 주위를 감싸고 있습니다. 왜냐하면 제한적이고 고정 된 수의 패킷 만 처리하기를 원하기 때문입니다. private RawCapture [] circularBuffer; 패킷을 버퍼에 넣기 전에 패킷을 디코딩하지는 않았지만 모두 수집하고 있습니다. 나는 당신에게 요점을 가지고 있다고 생각합니다 : 나는 원형 버퍼 때문에 패킷을 잃지 않을 것입니다. 나는 마지막 500,000 패킷만을 수집하려고합니다. 사용자가 멈 추면 그는 마지막 500,000 패킷 만 처리 할 것입니다. –

+0

사실 단일 스트림에 속한 각 패킷은 0에서 3999 사이의 카운터를가집니다. 예를 들어 스트림 A에 속한 패킷은 카운터 # 2333을 가질 수 있으며 스트림 A의 다음 패킷은 카운터 # 2334. 패킷을 디코딩 한 후, 즉 2333에서 2347로 건너 뛰는 것을 깨달았습니다. 충분히 명확했으면합니다. 예제가 훌륭하지만 "온라인 디코딩"이 필요하지 않습니다. 캡쳐하는 동안 패킷을 저장하고 처리하는 것이 좋습니다. 나는 충분히 명확했으면 좋겠다. –