2014-01-22 7 views
1

Я использую pcap.net для захвата пакетов. Метод, который захватывает пакеты, запущен в новом потоке. Когда я хочу остановить/возобновить захват, я использую ManualResetEvent, чтобы остановить/возобновить поток.pcap.net коммуникатор буферов пакетов в то время как поток остановлен

он работает нормально, проблема в том, что я разорву захват и запустил его снова (остановка и возобновление потока) - коммуникатор получил пакеты, которые пришли за время остановки потока. Я думаю, что это из-за буфера коммуникатора.

, хочет коммуникатор не получает пакеты, в то время как поток остановлен, и получить пакеты снова, когда поток возобновляются. любая помощь?

Мой код:

#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

Спасибо, человек! Это здорово! Так просто.. –

 Смежные вопросы

  • Нет связанных вопросов^_^