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

(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.");

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

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

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

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

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

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

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

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