Коммуникатор pcap.net буферизует пакеты во время остановки потока

Я использую 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

Большое спасибо!

1 ответ

Решение

Остановка / запуск потока - просто неправильный способ сделать это. Пусть поток работает постоянно, сообщите ему, когда вы хотите остановить / начать захват, и заставить его выбрасывать / обрабатывать пакеты в зависимости от этого.

Другие вопросы по тегам