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