(4-ый пример в папке Examples)

Пример программы в данном разделе по функционалу идентичен примеру из предыдущего раздела, но в нем используется ICaptureDevice.GetNextPacket() вместо метода регистрации обработчика события. Использование события OnPacketArrival является хорошей практикой и может быть хорошим выбором, в некоторых ситуациях, например, при захвате пакетов одновременно с нескольких устройств. Однако, использование обработки обратного вызова иногда не практично — это часто делает программу более сложной, особенно в ситуациях с многопоточными приложениями. В этих случаях GetNextPacket() возвращает пакет с прямым вызовом — с помощью GetNextPacket (), пакеты принимаются только тогда, когда программист хочет их получить. В следующей программе мы повторно использовали код обработчика события из предыдущего примера, но переместили его сразу после вызова GetNextPacket().

Примечание: В приведенном ниже примере программа завершится, если за время тайм-аута 1000 мс не будет ни одного пакета:

// Получаем устройство из списка устройств
ICaptureDevice device = devices[i];

// Открываем устройство для захвата
int readTimeoutMilliseconds = 1000;
device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);

Console.WriteLine();
Console.WriteLine("-- Listening on {0}...",
    device.Description);

Packet packet = null;

while((packet=device.GetNextPacket()) != null )
{
    // Выводим время и длину полученного пакета
    DateTime time = packet.PcapHeader.Date;
    int len = packet.PcapHeader.PacketLength;
    Console.WriteLine("{0}:{1}:{2},{3} Len={4}",
        time.Hour, time.Minute, time.Second,
        time.Millisecond, len);
}

// Закрываем pcap устройство
device.Close();
Console.WriteLine(" -- Capture stopped, device closed.");
Sharppcap. 3 — Захват пакетов без обработчика события.
Метки:

4 thoughts on “Sharppcap. 3 — Захват пакетов без обработчика события.

  • 18 марта 2014 на 07:36
    Постоянная ссылка

    В условии цикла ошибка:
    «неявное приведение типа SharpPcap.RawCapture» в «PacketDotNet.Packet»
    Из-за чего может быть такая неудача?

    Ответить
  • 18 марта 2014 на 08:08
    Постоянная ссылка

    Дело в том, что в статье описывается устаревшая версия ShrapPcap, вы используете уже свежую версию. По новому надо уже делать так:

    RawCapture raw = device.GetNextPacket();
    packet = Packet.ParsePacket(raw.LinkLayerType, raw.Data);

    простое присваивание уже не прокатит

    Ответить
  • 17 февраля 2015 на 13:02
    Постоянная ссылка

    Вместо «packet.PcapHeader.Date» ни «raw.Timeval.Date» надо?
    и вместо «packet.PcapHeader.packetLength» — «raw.Date.Length»?

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и соглашаюсь c политикой конфиденциальности *