2014-01-22 35 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

谢谢你!它效果很好!很简单.. –