2014-01-22 5 views
1

패킷을 캡처하는 데 pcap.net을 사용하고 있습니다. 패킷을 캡처하는 메서드가 새 스레드에서 실행 중입니다. 캡처를 중지/다시 시작하려면 ManualResetEvent를 사용하여 스레드를 중지/다시 시작하십시오.pcap.net communicator는 스레드가 중지 된 동안 패킷을 버퍼합니다.

잘 작동하지만 캡처를 중단하고 다시 시작 (스레드 중지 및 다시 시작) 할 때 문제가 발생합니다. 통신자가 스레드가 중지 된 시간에 들어오는 패킷을 받았습니다. 나는 그것 때문에 커뮤니 케이 터의 버퍼의 생각.

스레드가 정지 된 상태 로 의사 소통이 패킷을을 얻을 싶어하고, 스레드가 재개 될 때 다시을 패킷을 얻을 것이다. 어떤 도움이 필요합니까?

내 코드 :

#region Members 
    private PacketCommunicator _Communicator; 
    private IList<LivePacketDevice> _allDevices; 
    private PacketDevice selectedDevice; 
    private Thread captureThread; 
    private ManualResetEvent _pauseEvent = new ManualResetEvent(true); 

    #endregion 

    #region Methods 

    public PacketGateway() 
    { 
     try 
     { 
      _allDevices = LivePacketDevice.AllLocalMachine; 
      selectedDevice = _allDevices[0]; 
      captureThread = new Thread(StartListening); 
     } 
     catch (Exception e) 
     { 
      throw e; 

     } 
    } 

    // Starts/Resumes the Thread 
    public void Start() 
    { 
    /// Starts the Thread the first time 
     if (captureThread.ThreadState == ThreadState.Unstarted) 
     { 
      _Communicator = selectedDevice.Open(); 
      captureThread.Start(); 
     } 
    /// Resumes the Thread 
     if (captureThread.ThreadState == ThreadState.WaitSleepJoin) 
     { 
      _pauseEvent.Set(); 
     } 
    } 


    public void Stop() 
    { 
     /// stop the thread 
     _pauseEvent.Reset(); 
    } 


// Starts to recieve packets 
    public void StartListening() 
    { 
     try 
     { 
      _Communicator.ReceivePackets(0, HandlePacket); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 


// Handles Packet 
    private void HandlePacket(Packet packet) 
    { 
     // some work.. 
    } 

    #endregion 

고마워요!

답변

1

스레드를 중지/시작하는 것은 잘못된 방법 일뿐입니다. 스레드가 항상 실행되도록하고 캡쳐를 중지/시작할 때 알려주고 그에 따라 패킷을 버리거나 처리하도록하십시오.

+0

고마워요! 정말 잘됐다! 너무 단순 .. –