Проблема 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,

Надеюсь, вы, ребята, можете помочь мне с этим:)

0 ответов

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