1

パケットをキャプチャするために pcap.net を使用しています。パケットをキャプチャするメソッドは、新しいスレッドで実行されています。キャプチャを停止/再開したい場合は、ManualResetEvent を使用してスレッドを停止/再開します。

それは正常に動作します。問題は、キャプチャを中断して再度開始するときです (スレッドを停止して再開する) - コミュニケーターは、スレッドが停止している間に受信したパケットを受信しました。コミュニケータのバッファが原因だと思います。

スレッドが停止している間はコミュニケーターがパケットを取得しないようにし、スレッドが再開されると再びパケットを取得するようにします。助けはありますか?

私のコード:

    #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

どうもありがとう!

4

1 に答える 1