Logowanie danych z karty sieciowej - problem w szczegółach

0

Usiłuję zapisywać dane, które przechodzą przez kartę sieciową (w Bytes) ale wyświetlać sobie w formie czytelnej w GB.
No i jest fajnie dopóki nie okazuje się, że tak nie jest.

  1. Logowanie do plików nie działa, gdzieś się zapisuje ale nie wiem gdzie, na początku zapisywało tam gdzie miałem skompilowane exe, a teraz pewnie w jakimś temp. a nie w skazanej ścieżce -- dlaczego?

  2. Jak mogę zmodyfikować ten kod aby w konsoli wyświetlał dane AKTUALNE - NOW, TERAZ, a nie historię?

  3. Chciałem ale to pewnie sie nie uda, aby w pliku network_usage_data.txt był tylko ostatni zapis dla dnia (data) lub wyłączenia programu z data

    w punkcie 3 chodzi o to aby to wyglądało tak:

2018-09-19=5404072084|296950464
2018-09-20=8598128866|326840254

Tylko oczywiście samo musi się dopisywać (DOPISYWAĆ) a nie usuwać aby zawsze w pliku network_usage_data.txt było takie drzewko. Jeśli wyłączyłem program np. 06.02.2024 to zapisuje on ostatni zapis z temp. plik do usage_data a gdy znów włączę to zrobi drugi wpis.

  1. Czy mogę automatycznie usuwać plik temp. np. po osiągnięciu wielkości albo dni gdy nie będzie już potrzebny? Docelowo potrzebny będzie tylko plik z DATA.

Kod który mam:

using System;
using System.IO;
using System.Linq;
using System.Net.NetworkInformation;
using System.Threading;

class Program
{
    static long totalBytesSent = 0;
    static long totalBytesReceived = 0;
    static string currentDay = DateTime.Now.ToString("yyyy-MM-dd");
    static string tempFilePath = "C:\\Network\\network_usage_temp.txt";
    static string dataFilePath = "C:\\Network\\network_usage_data.txt";

    static void Main(string[] args)
    {
        // Wybór interfejsu sieciowego na podstawie adresu IP
        string targetIPAddress = "192.168.1.10"; 
        var netInterface = NetworkInterface.GetAllNetworkInterfaces()
            .FirstOrDefault(ni => ni.GetIPProperties().UnicastAddresses
                .Any(addr => addr.Address.ToString() == targetIPAddress));

        if (netInterface == null)
        {
            Console.WriteLine($"Nie można znaleźć interfejsu sieciowego dla adresu IP {targetIPAddress}");
            return;
        }

       
        while (true)
        {
            long bytesSent = netInterface.GetIPv4Statistics().BytesSent;
            long bytesReceived = netInterface.GetIPv4Statistics().BytesReceived;

            
            long deltaBytesSent = bytesSent - totalBytesSent;
            long deltaBytesReceived = bytesReceived - totalBytesReceived;

            // Aktualizacja całkowitej liczby wysłanych i odebranych bajtów
            totalBytesSent = bytesSent;
            totalBytesReceived = bytesReceived;

            // Jeśli mamy nowy dzień, zapisujemy dane do pliku
            string currentDayNow = DateTime.Now.ToString("yyyy-MM-dd");
            if (currentDayNow != currentDay)
            {
                SaveDataToFile();
                currentDay = currentDayNow;
            }

            // Wyświetlenie aktualnych informacji tylko na koniec dnia lub po wyłączeniu programu
            Console.WriteLine($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] Wysłano: {deltaBytesSent} bytes | Odebrano: {deltaBytesReceived} bytes");

            // Oczekiwanie sekundę przed kolejnym sprawdzeniem
            Thread.Sleep(1000);
        }
    }

    static void SaveDataToFile()
    {
        // Zapis danych do pliku
        string data = $"{currentDay}={totalBytesSent}|{totalBytesReceived}\n";
        using (StreamWriter writer = new StreamWriter(tempFilePath, true))
        {
            writer.Write(data);
        }
    }
}

1

Nie rozumiem po co sobie utrudniać życie i pisać samemu skoro do logowania są gotowe narzędzia - log4net, serilog, nlog... Do wyboru, do koloru. Zainstaluj sobie wszystko, poczytaj tutoriale, obejrz coś na YT i wybierz jeden, który ci odpowiada i nie wymyślaj koła na nowo.

0

Output po każdym pakiecie to morderstwo

0
ortoraf napisał(a):
  1. Logowanie do plików nie działa, gdzieś się zapisuje ale nie wiem gdzie, na początku zapisywało tam gdzie miałem skompilowane exe, a teraz pewnie w jakimś temp. a nie w skazanej ścieżce -- dlaczego?

StreamWriter wygląda poprawnie jest tam path, czyli ścieżka po polsku i true parametr ten true jest do określania czy ma być append, czyli dodawanie na koniec pliku i tu wygląda wszystko dobrze.
Chodź i tak nie znam C#.
Wydaje mi się, że C:/Network/ katalog, może wymagać podwyższenia uprawnień, w windowsie na dysku C jeśli jest dobrze wszystko to możesz zapisywać pliki tylko do desktop, download w home, ale jak chcesz pliki systemowe czy w ogóle coś na dysku modyfikować to musisz mieć wyższe uprawnienia lub dla danego katalogu ustawić, żeby nie wymagał wyższych uprawnień.
Na linuxie praktycznie wszystko poza home wymaga wyższych uprawnień prócz zewnętrznych nośników.

Prawdopodobnie, aplikacja nie mogła utworzyć pliku, a funkcja zwróciła błąd, ale on nie został wyświetlony na ekran czy do logów.

  1. Chciałem ale to pewnie sie nie uda, aby w pliku network_usage_data.txt był tylko ostatni zapis dla dnia (data) lub wyłączenia programu z data

    w punkcie 3 chodzi o to aby to wyglądało tak:

2018-09-19=5404072084|296950464
2018-09-20=8598128866|326840254
Tylko oczywiście samo musi się dopisywać (DOPISYWAĆ) a nie usuwać aby zawsze w pliku network_usage_data.txt było takie drzewko. Jeśli wyłączyłem program np. 06.02.2024 to zapisuje on ostatni zapis z temp. plik do usage_data a gdy znów włączę to zrobi drugi wpis.

No tu jest różnie, bo jak wyłączysz komputer to teoretycznie program też wyłączyłeś, ale on nie zdąży przekopiować nic z jednego pliku do drugiego.
W taki sposób musiałbyś ciągle zmieniać najbardziej aktualny wpis w drugim pliku, bo jakby nastąpiło jakieś wyjście nieplanowane to po prostu zostanie ostatnio najnowsza wartość zapisana.

  1. Czy mogę automatycznie usuwać plik temp. np. po osiągnięciu wielkości albo dni gdy nie będzie już potrzebny? Docelowo potrzebny będzie tylko plik z DATA.

To akurat twój program to możesz robić co chcesz, jak dla mnie może w ogóle nie być tego pliku.

Od razu zapisuj do Data i jak dzień będzie inny niż w aktualnej linijce to dopisz do następnej i automatycznie zapisuje się tylko co dzień, ale uaktualnia się co 1sekundę.

0

Coś czuję, że SaveDataToFile nie jest zbyt często wywoływane.
Może i kod nie działa, za to przynajmniej nie ma problemów z wydajnością.

1 użytkowników online, w tym zalogowanych: 0, gości: 1