パケットをキャプチャするために 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
どうもありがとう!