Проверьте буфер на вложенных циклах - PullRequest
0 голосов
/ 10 мая 2018

Я работаю над Java-проектом, основанным на анализе сетевого трафика.Я создал классы, которые загружают данные из входных и выходных файлов в расширении pcap (я загружал из них время и размер пакета).У меня проблема с основным логарифмом, задача которого заключается в проверке состояния буфера.Я должен проверить, сколько раз и сколько времени буфер был пуст, сколько раз была неудачная попытка вывести пакет из буфера и окончательный размер буфера.

Я создал логику в методе analisys_buffer, который устанавливает хронологическое время,это значит: если output_time больше, чем input_time, output_size добавляется в буфер (buffer_size), если input_size больше, input_size является субтактным из буфера.Я использую nasted циклы, сначала по длине входного файла, второй цикл (внутри) по длине выходного файла.Приложение работает, но, наконец, вывод не корректен, переменные равны 0 (только размер буфера слишком велик).Я понятия не имею, что еще я должен изменить в коде, любое предложение?

import org.jnetpcap.util.PcapPacketArrayList;

public class Buffer {

int buffer_size =0;      //initial size the buffer
int failed_attempt =0;    //count unsuccessful attempt to output packet from the buffer
double time_empty = 0;    //time for which buffer was empty
int count_empty =0;       //count for which buffer was empty

public Buffer(int buffer_size) {
    this.buffer_size = buffer_size;
}

public Buffer() {
    // TODO Auto-generated constructor stub
}


public void analysis_buffer(PcapPacketArrayList packetArrayList, PcapPacketArrayList packetArrayList2, double[] input_time, double[] output_time, int[] input_size, int[] output_size) {


    for (int i = 0; i < packetArrayList.size(); i++) {

        for (int j = 0; j < packetArrayList2.size(); j++) {

            // if output time is greater than input time, add input size to main buffer size
            if (input_time[i] < output_time[j]) {
                buffer_size = buffer_size + input_size[i];              
                }

            //  if input time is greater than output time, we have 3 options
            //  1. buffer size is greater than output size packet and output is subtracting from buffer size
            //  2. buffer size is smaller than output packet - buffer size is automatically equal 0 
            //  3. buffer size is equal 0, I'm increasing unsuccessful attempt to get out of the buffer and saves time when buffer was empty 

            else if (input_time[i] > output_time[j]) {

                    if(output_size[j] < buffer_size) {                                      
                        buffer_size = buffer_size - output_size[j];
                        }

                    if(output_size[j] > buffer_size) {
                        buffer_size = 0;
                        count_empty++;
                        }

                    if(buffer_size == 0) {
                        failed_attempt++;
                        time_empty = time_empty + (output_time[j+1]-output_time[j]);
                        }
                    }               

            // if input time is equal output time, add and subtract packets from buffer size, or buffer size is automatically equal 0
            else if (input_time[i] == output_time[j]) {

                if(output_size[j] < buffer_size) {
                    buffer_size = buffer_size + input_size[i] - output_size[j];
                    }

                if(output_size[j] > (buffer_size + input_size[i])){
                    buffer_size = 0;
                    count_empty++;
                    }
                }               
            }
        }
    }


public void check_buffer() {

    System.out.println("Initial buffer size was 0");
    System.out.println("Final buffer size: " + buffer_size +".");
    System.out.println("Buffer was empty " + count_empty +" times.");
    System.out.println("Failed attempt to output data from the buffer: " + failed_attempt +" times.");
    System.out.println("Total time for which the buffer was empty: " + time_empty + " seconds.");
    }

}

Мой вывод:

Начальный размер буфера был 0

Конечный размер буфера: 1227700210.

Буфер был пуст 1 раз.

Неудачная попытка вывода данных из буфера: 0 раз.

Общее время, за которое буфербыл пуст: 0,0 секунд.

1 Ответ

0 голосов
/ 10 мая 2018

Я попробовал ваш код со следующими значениями:

String[] p = new String[4];
String[] p2 = new String[4];
double[] it = {5432d, 4234d, 6345d, 64320d, 8534d};
double[] ot = {5436d, 4234d, 6342d, 64326d, 8534d};
int[] is = {45, 654, 79, 16354, 4563};
int[] os = {65, 641, 98, 23346, 9846};
Buffer buffer = new Buffer();
buffer.analysis_buffer(p, p2, it, ot, is, os);
buffer.check_buffer();

И я получил такой результат:

Initial buffer size was 0
Final buffer size: 16354.
Buffer was empty 3 times.
Failed attempt to output data from the buffer: 3 times.
Total time for which the buffer was empty: 62200.0 seconds.

Переменные failed_attempt и time_empty изменяются только в этомместо:

if(buffer_size == 0) {
  failed_attempt++;
  time_empty = time_empty + (output_time[j+1]-output_time[j]);
}

Я думаю, что условие не было выполнено (с вашими значениями теста), и, возможно, ни одно из следующих:

if(output_size[j] > buffer_size) {
  buffer_size = 0;
  count_empty++;
}

и

else if (input_time[i] > output_time[j]) {

Кстати, попробуйте исправить это:

java.lang.ArrayIndexOutOfBoundsException: 5
    at Buffer.analysis_buffer(Buffer.java:47)

С этими значениями:

String[] p = new String[5];
String[] p2 = new String[5];
double[] it = {5432d, 4234d, 6345d, 64320d, 8534d};
double[] ot = {5436d, 4234d, 6342d, 64326d, 8534d};
int[] is = {45, 654, 79, 16354, 4563};
int[] os = {65, 641, 98, 23346, 9846};
Buffer buffer = new Buffer();
buffer.analysis_buffer(p, p2, it, ot, is, os);
buffer.check_buffer();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...