Не получается ли зацикливаться на PCAP дважды с io.pkts? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь проанализировать файл pcap двумя разными способами, используя два разных метода. Файл pcap передается классу при его создании, который содержит оба метода. Когда я использую файл pcap в первом методе, нет проблем зацикливания. Однако, когда я go анализирую его во второй раз во втором методе, ничего не происходит, когда я пытаюсь распечатать каждый пакет. Я попытался передать файл pcap напрямую второму способу, но все еще не играл в кости. Нужно ли сбрасывать счетчик / указатель? Есть идеи?

Как файл pcap загружается с диска

pcap = Pcap.openStream(pcapPath);

Как конструктор класса получает файл pcap

    public PcapParsing(Pcap pcap) {
    this.pcap = pcap;
}

Как оба метода анализируют файл pcap

    public void arpFloodDetect(Pcap ppcap)
{

    try {
        ppcap.loop((final Packet packet) -> {

            System.out.println(ppcap.toString());



            return true;
        });
    } catch (IOException e) {
        e.printStackTrace();
    }

}

1 Ответ

1 голос
/ 02 мая 2020

Нужно ли сбрасывать счетчик / указатель?

Вам нужно создать новый Pcap, снова вызвав Pcap.openStream. API Pcap не предоставляет никаких методов для сброса базового потока.


Файлы Pcap могут быть большими, как пара гигабайт или больше. Будет ли это добавлять значительную потерю нагрузки при каждом вызове?

Это зависит от того, насколько хороша ваша файловая система. Если мы предполагаем, что ваша файловая система находится на быстром локальном твердотельном накопителе, и вы используете ОС, которая использует оперативную память для кэширования буфера файловой системы, то чтение большого файла будет быстрым в первый раз и более быстрым во второй раз.

Это также зависит от того, что вы подразумеваете под "значительным" и что приемлемо. И сколько денег вы готовы заплатить за обновление вашего оборудования для достижения приемлемой производительности.

Не знаете ли вы, что вы знаете другой способ загрузки файлов, который позволяет избежать штрафа, если он есть?

В основном, нет.

Единственные другие альтернативы, которые я могу придумать, включают чтение или отображение всего файла в адресное пространство JVM, а затем завершение его в InputStream. Вам все еще нужно создать Pcap для каждого прохода через файл.

Но проблема в том, что ему требуется столько адресного пространства JVM, сколько размер файла, который вы обрабатываете. Если размер файла значительно превышает объем доступной физической памяти, он может быть ужасным:

  • В лучшем случае ваша производительность будет эквивалентна повторному чтению файла из диск.
  • В худшем случае ваше приложение перебивает и ставит операционную систему на колени (или убивает OOM, чтобы предотвратить это).

Текущая реализация Pcap предназначена для Избегайте этого путем , а не кэширования данных в ОЗУ. Вот как он может справляться с огромными входными файлами без исчерпания памяти, и т. Д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...