Entwickler-Ecke

Netzwerk - IPv4InterfaceStatistics Differenz zur Netzwerkübersicht


Regan - Mo 23.01.12 17:49
Titel: IPv4InterfaceStatistics Differenz zur Netzwerkübersicht
Hallo,

ich wollte mir gerade kurz einen Trafficlogger schreiben. Unter anderem mache ich das so:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
            NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
            label1.Text = Convert.ToString(nics.Length);
            foreach (NetworkInterface netint in nics)
            {
                if (netint.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
                {
                    listBox1.Items.Add(netint.Name + netint.Id + netint.Speed);
                    IPv4InterfaceStatistics intstat = netint.GetIPv4Statistics();
                    listBox2.Items.Add(netint.Name + " - " + Convert.ToString(intstat.BytesReceived));
                    long s = intstat.BytesReceived - intstat.NonUnicastPacketsReceived;
                    listBox2.Items.Add(netint.Name + " - " + Convert.ToString(s));
                }
            };

Das ganze habe ich an einen Timer gehangen, der das ganze aktualisiert. Nun gibt es in der Netzwerkübersicht von Windows auch die Möglichkeit, sich die Empfangenen Pakete anzuschauen. Das habe ich getan und musste feststellen, dass die .NET Routine (trotz meiner Subtraktion bei long s) schlappe 10.000.000 Bytes über der von Windows liegt :shock:

Hat da jemand eine Idee, was ich falsch mache? Eigentlich müsste doch der gleiche Traffic herauskommen :nixweiss:

Grüße
Regan


Th69 - Mo 23.01.12 18:21

Hallo Regan,

du substrahierst Pakete von Bytes, das kann doch irgendwie nicht richtig sein...

Ich bin mir aber bei BytesReceived nicht sicher, ob dies alle empfangenen Bytes sind oder nur die Nutzdaten (ich denke laut MSDN eher ersteres).


Regan - Mo 23.01.12 19:10

Wenn ich die Pakete nicht subtrahieren würde, wären es ja noch mehr. Da wäre der Unterschied zu groß. Wie gesagt: Netzwerkanzeige < Programm. Ich habe das auch nochmal in einem Screenshot dokumentiert. Da habe ich auch die Subtraktion herausgenommen und schreibe nur die gesendeten und empfangenen Bytes nieder.

Edit: Gerade mal testweise IPv6 auf dem LAN-Adapter deaktiviert und neugestartet: gleiches Bild.


Th69 - Di 24.01.12 13:17

Ich kenne mich nicht im Detail mit dem TCP/IP-Protokoll aus, aber wahrscheinlich wirst du die (konstante) Headergröße (je Paket) subtrahieren müssen, d.h.

Quelltext
1:
userBytesReceived = totalBytesReceived - HeaderSize * PacketsReceived;                    


Regan - Mi 25.01.12 14:18

Das funktioniert leider nicht so einfach. Ich habe auch mal probehalber netstat -e ausgeführt. Das führt mich zu noch anderen Ergebnissen. Schade, dann funktioniert das wohl nicht.