(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.RawCapture» в «PacketDotNet.Packet»
Из-за чего может быть такая неудача?
Дело в том, что в статье описывается устаревшая версия ShrapPcap, вы используете уже свежую версию. По новому надо уже делать так:
RawCapture raw = device.GetNextPacket();
packet = Packet.ParsePacket(raw.LinkLayerType, raw.Data);
простое присваивание уже не прокатит
Спасибо большое!
Так и думал, что то подобное.
Вместо «packet.PcapHeader.Date» ни «raw.Timeval.Date» надо?
и вместо «packet.PcapHeader.packetLength» — «raw.Date.Length»?