Cześć
Robię projekt polegający na analizie ruchu sieciowego pcap. Stworzyłem klasy które odczytują dane(czas oraz rozmiar pakietu) z pliku wejściowego oraz wyjściowego w formacie .pcap i to działa poprawnie. Problem mam z logarytmem który sprawdza stan bufora (ile razy bufor był pusty, ile razy wyjęcie danych się nie powiodło, czas przez jaki bufor był pusty oraz rozmiar końcowy bufora). Docelowo metoda analysis_buffer ma dodawać lub odejmować input_size/output_size w zależności od input_time/output_time, dane te sprawdzam w pętlach, pierwsza puszczona jest po wielkości tablicy z danymi z pliku wejściowego, druga zagnieżdżona ustawiona jest wielkość tablicy z pakietami wyjściowymi. Program działa jednak output jest niepoprawny.
"Final buffer size: 1227700210.
Buffer was empty 1 times.
Failed attempt to output data from the buffer: 0 times.
Total time for which the buffer was empty: 0.0 seconds."
Wrzucam kod z dwóch metod, więcej chyba nie jest potrzebne.
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 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 subtracted 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.");
}
}
I teraz pytanie, w dobry sposób zabrałem się za porównywanie dwóch plików? w czym jest problem, że działania nie wykonują się poprawnie i po przejściu pętli zmienne maja dalej wartość zerowa? Każda wskazówka jest na wagę złota!