Проблема SharpPcap. Внезапная остановка захвата? Как перезапустить захват после сбоя?
Я создал инструмент для SharpPcap, который прослушивает пакеты на определенном порту, проверяет их и извлекает некоторые данные.
Технически это должно быть довольно просто, но после некоторых случаев, например, часто при наличии двух подключений к этому порту, захват внезапно останавливается и не продолжается без какой-либо определенной причины. Иногда он просто перестает работать с одним соединением через несколько минут, часов или в редких случаях, он никогда не начинает захватывать (никаких уведомлений, ошибок или чего-то подобного). Я использую очень простой код для захвата, который также часто можно найти в Интернете, поэтому я сомневаюсь, что это является причиной его сбоя
Некоторые фрагменты:
CaptureDeviceList devices;
private static byte[] EncryptionKey = { };
private static string filter = "port 12000 and len > 60" + Environment.NewLine;
private static int readTimeoutMilliseconds = 5000;
private static int defaultDevice = -1;
private static System.Collections.Generic.List<byte> _incomingBuffer = new
System.Collections.Generic.List<byte>();
Базовая настройка, взятая прямо из документации по SharpPcap, немного изменилась, чтобы соответствовать моим потребностям.
В основном методе:
devices = CaptureDeviceList.Instance;
Затем следует метод, который получает выбранный адаптер из формы.
Пока это работает. Настройки выбираются правильно, правильное устройство и так далее.
После этого я пытаюсь начать захват:
private void captureStarter()
{
try
{
int ID = networkID();
var device = devices[ID];
device.OnPacketArrival += new PacketArrivalEventHandler(PacketCapturer);
device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
device.Filter = filter;
device.StartCapture();
}
catch (Exception ex)
{ log.Info(ex)}
}
Пример выше обрабатывает начальный запуск. Он получает идентификатор, устанавливает его, регистрирует обработчик событий, открывает устройство и запускает захват. Работает. Вещи попадают в плен... и вот идут проблемы. Я работаю. На некоторое время... 90% времени. Иногда он даже не начинает захватывать, без каких-либо ошибок или чего-то подобного. Ну, вот и все. Ооо, скажем, захват работает. Ницца! Час спустя - шансы, что захват только что остановился. Открываете второй экземпляр программы, который вынюхивал? Захват мертв.
Я понятия не имею, почему это так. Я пытаюсь слушать в порту. Больше или меньше трафика не должно влиять на это, по крайней мере, так я и думал. Кроме того, почему он не может захватить случайно через некоторое время? Я просто не понимаю:/
Итак, я попытался создать "кнопку сброса", чтобы просто сбросить захват с помощью простого нажатия кнопки.
private void captureStarter(bool arg)
{
if(arg)
{
try
{
int ID = networkID();
var device = devices[ID];
_incomingBuffer.Clear();
device.StopCapture();
device.Close();
device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
device.Filter = filter;
device.StartCapture();
}
catch (Exception ex)
{ log.Info(ex)}
}
}
Я прекращаю захват и закрываю адаптер, проверяю правильность настроек и пытаюсь снова захватить.. аааа и ничего. Ничто не попадает в плен, и я не знаю, что не так, ни в чем проблема, ни что я мог сделать, чтобы решить или обойти эту проблему.
Я читал о том, что кто-то просто постоянно перезапускает все приложение с помощью скрипта, но это не вариант. Я бы предпочел заняться проблемой в первую очередь, но я боюсь, что это может быть проблемой с самим WinPcap/SharPcap,
Надеюсь, вы, ребята, можете помочь мне с этим:)