Welche Netzwerkverbindung wird benutzt ?



  • Ich habe mir für Win11 ein kleines Programm mit C# geschrieben, das in etwa die Funktion des bis win10 benutzbaren NetSpeedMononitor hat, d.h. es werden ständig in der Taskleiste die Upload- und Download-Aktivitäten angezeigt. Auf meinem neuen PC mit einer Ryzen 9 5900X CPU und einem Mainboard GIGABYTE X570S AURUS ELITE AX gibt es ein neues Problem, dieses Mainboard hat bisher unüblich für Desktop-PCs sowohl LAN als auch WLAN on Board und beide Schnittstellen werden angezeigt. Ich benutze LAN (kein WLAN), wie kann ich das aber im Programm erkennen, ob LAN oder WLAN verwendet wird.
    Bei meinem etwas betagten Lenovo-G560-Laptop gibt es auch LAN und WLAN (ich nutze dort WLAN), da wird aber nur bei dem aktiven Netzwerk-Adapter (WLAN) die FritzBox angezeigt. Auch dort benutze ich Win11 und mein NetSpeed-Programm.

    Ich habe für die Identifizierung des zu benutzenden Netzwerk-Adapters ein kleines Testprogramm geschrieben, das die wesentlichen Informationen anzeigt.

    Wie kann ich auf dem Ryzen 9 PC mit neuen GIGABYTE-Mainboart erkennen, ob LAN oder WLAN tatsächlich benutzt wird.
    Ich habe auch den VMWare Workstation 16 Player installiert, deshalb gibt es die virtuellen Netzwerke.

    Hier die Ergebnisse des Test-Programmes:
    Ryzen9-PC

    **
    Index 0 ~ Realtek Gaming 2.5GbE Family Controller #2
      DNS suffix .............................. : fritz.box
      adapter.Description ..................... : Realtek Gaming 2.5GbE Family Controller #2
      adapter.Name ............................ : Ethernet 4
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 1 ~ RZ608 Wi-Fi 6E 80MHz
      DNS suffix .............................. : fritz.box
      adapter.Description ..................... : RZ608 Wi-Fi 6E 80MHz
      adapter.Name ............................ : WLAN
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 2 ~ Microsoft Wi-Fi Direct Virtual Adapter
      DNS suffix .............................. :
      adapter.Description ..................... : Microsoft Wi-Fi Direct Virtual Adapter
      adapter.Name ............................ : LAN-Verbindung* 9
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 3 ~ Microsoft Wi-Fi Direct Virtual Adapter #2
      DNS suffix .............................. :
      adapter.Description ..................... : Microsoft Wi-Fi Direct Virtual Adapter #2
      adapter.Name ............................ : LAN-Verbindung* 10
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 4 ~ VMware Virtual Ethernet Adapter for VMnet1
      DNS suffix .............................. :
      adapter.Description ..................... : VMware Virtual Ethernet Adapter for VMnet1
      adapter.Name ............................ : VMware Network Adapter VMnet1
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 5 ~ VMware Virtual Ethernet Adapter for VMnet8
      DNS suffix .............................. :
      adapter.Description ..................... : VMware Virtual Ethernet Adapter for VMnet8
      adapter.Name ............................ : VMware Network Adapter VMnet8
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 6 ~ Bluetooth Device (Personal Area Network) #4
      DNS suffix .............................. :
      adapter.Description ..................... : Bluetooth Device (Personal Area Network) #4
      adapter.Name ............................ : Bluetooth-Netzwerkverbindung 4
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 7 ~ Software Loopback Interface 1
      DNS suffix .............................. :
      adapter.Description ..................... : Software Loopback Interface 1
      adapter.Name ............................ : Loopback Pseudo-Interface 1
      adapter.NetworkInterfaceType ............ : Loopback
    
    fritz.box im Index: 0 und 1
    **
    

    Beim Lenovo-G560-Notebook, wo es auch LAN und WLAN gibt, sieht es so aus:

    **
    Index 0 ~ Realtek PCIe FE Family Controller
      DNS suffix .............................. :
      adapter.Description ..................... : Realtek PCIe FE Family Controller
      adapter.Name ............................ : Ethernet
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 1 ~ Microsoft Wi-Fi Direct Virtual Adapter
      DNS suffix .............................. :
      adapter.Description ..................... : Microsoft Wi-Fi Direct Virtual Adapter
      adapter.Name ............................ : LAN-Verbindung* 1
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 2 ~ Microsoft Wi-Fi Direct Virtual Adapter #2
      DNS suffix .............................. :
      adapter.Description ..................... : Microsoft Wi-Fi Direct Virtual Adapter #2
      adapter.Name ............................ : LAN-Verbindung* 2
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 3 ~ Broadcom 802.11n Network Adapter
      DNS suffix .............................. : fritz.box
      adapter.Description ..................... : Broadcom 802.11n Network Adapter
      adapter.Name ............................ : WLAN
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 4 ~ Bluetooth Device (Personal Area Network) #2
      DNS suffix .............................. :
      adapter.Description ..................... : Bluetooth Device (Personal Area Network) #2
      adapter.Name ............................ : Bluetooth-Netzwerkverbindung 2
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 5 ~ Software Loopback Interface 1
      DNS suffix .............................. :
      adapter.Description ..................... : Software Loopback Interface 1
      adapter.Name ............................ : Loopback Pseudo-Interface 1
      adapter.NetworkInterfaceType ............ : Loopback
    
    fritz.box im Index: 3
    **
    

    Hier der C#-Code des kleinen Test-Programmes

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net.NetworkInformation;
    
    namespace NetConsole
    {
        class Program
        {
            static void Main(string[] args)
            {
                DisplayDnsConfiguration();
            }
    
            public static void DisplayDnsConfiguration()
            {
                int idx = 99;
                string FritzIDX = "";
                int i = 0;
                NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface adapter in adapters)
                {
                    IPInterfaceProperties properties = adapter.GetIPProperties();
                    Console.WriteLine("Index {0} ~ {1}",
                        i, adapter.Description);
                    Console.WriteLine("  DNS suffix .............................. : {0}",
                        properties.DnsSuffix);
                    Console.WriteLine("  adapter.Description ..................... : {0}",
                        adapter.Description);
                    Console.WriteLine("  adapter.Name ............................ : {0}",
                        adapter.Name);
                    Console.WriteLine("  adapter.NetworkInterfaceType ............ : {0}",
                        adapter.NetworkInterfaceType);
                    string dns = properties.DnsSuffix;
                    if (dns == "fritz.box") 
                    { 
                        idx = i;
                        if (FritzIDX.Length > 0) 
                        {
                            FritzIDX = FritzIDX + " und ";
                        }
                        FritzIDX = FritzIDX + idx.ToString();
                    }
                    i++;
                }
                Console.WriteLine();
                Console.WriteLine("fritz.box im Index: {0}", FritzIDX);
    
                Console.ReadKey();
    
            }
        }
    }
    


  • Ich bin mir nicht sicher, ob ich dein Problem richtig verstanden habe.
    Du hast eine Art Traffic Monitor, der Up- und Downloadaktivitäten anzeigt, kannst die Aktivitäten aber keinem Adapter zuordnen (LAN oder WLAN)?
    Wie stellst du denn Aktivität fest? Hast du Zugriff auf die einzelnen TCP/IP Pakete und kannst dir da die MAC Adressen oder TCP/IP Adressen angucken?

    Der Code, den du gepostet hast, identifiziert ja nur den fritz.box Adapter, Traffic wertest du da nicht aus.



  • @DocShoe
    ich habe es inzwischen so gelöst, dass ich den LAN-Adapter benutze - klappt für mich.
    Als universell nutzbares Programm ist das keine Lösung.

    Hier der Auszug aus meinem Programm => ich benutze den ersten Treffer, bei dem die fritzbox angegeben ist - bei mir klappt das, ist aber nicht ganz sauber.

                string[] CommandLineArgs = Environment.GetCommandLineArgs();
                string PgmName = CommandLineArgs[0];
                iniFileName = PgmName.Substring(0, PgmName.Length - 3) + "ini"; // ini statt exe
    
                idx = 99;
                int i = 0;
                NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface adapter in adapters)
                {
                    IPInterfaceProperties properties = adapter.GetIPProperties();
                    string dns = properties.DnsSuffix;
                    if (dns == "fritz.box") 
                    { 
                        idx = i;
                        goto Gefunden;
                    }
                    i++;
                }
    
               Gefunden:
    
                if (idx == 99) 
                {
                    const string message = "Es wurde keine Verbindung zur fritz.box gefunden - Abbruch";
                    const string caption = "NetSpeedHK - keine fritz.box";
                    var result = MessageBox.Show(message, caption,
                                                 MessageBoxButtons.YesNo);
    
                    Application.Exit();
                }
    
    

    Und hier der Auszug aus der Timer-Routine, die pro Sekunde aufgerufen wird, wo die Werte für Upload (U) und Download (D) ermittelt werden.

              interfaceStats = NetworkInterface.GetAllNetworkInterfaces()[idx].GetIPv4Statistics();
    
                decimal previousbytessendZW = previousbytessend;
                decimal previousbytesreceivedZW = previousbytesreceived;
    
                previousbytessend = interfaceStats.BytesSent;
                previousbytesreceived = interfaceStats.BytesReceived;
    
                decimal uploadspeed = ((previousbytessend - previousbytessendZW) * 8 / 1024);
                decimal downloadspeed = ((previousbytesreceived - previousbytesreceivedZW) * 8 / 1024);
    
                string txD = (Math.Round(downloadspeed, 2)).ToString("#,###,##0.00");
                while (txD.Length < 12)
                { txD = " " + txD; }
    
                string txU = (Math.Round(uploadspeed, 2)).ToString("#,###,##0.00");
                while (txU.Length < 12)
                { txU = " " + txU; }
    


  • Ich verstehe dein Problem immer noch nicht...

    Was spricht denn dagegen, den gesamten Traffic für alle Adapter auszuwerten? Und dann gibt dein Tool halt die Statistiken für alle Adapter aus. Du kannst ja noch die Option einbauen, dass dein Tool nur die Statistik für einen bestimmten Adapter ausgibt. Wenn das Tool universell einsetzbar sein soll darf es natürlich auch nicht auf den DNS-Suffix gucken, eine Unterscheidung nach NetworkInterfaceType.

    Weitere Überlegungen, wenn das Tool universell einsetzbar sein soll:

    • IPv6 Unterstützung
    • WLAN und LAN können parallel betrieben werden
    • es gibt möglicherweise mehrere physikalische LAN/WLAN Adapter

    PS:
    Wenn sich im laufenden Betrieb die Konfiguration der Adapter ändert (zB durch Aktivierung/Deaktivierung eines Adapters) kann sich der Index verschieben. Sinnvoller ist da möglicherweise, sich die ID zu merken und den Adapter über diese ID zu suchen.



  • Definitiver Tipp: Vermeide GoTos. Verwende englische Variablen-Namen. Damit tust du dir nachher leichter, das Programm und den Fluss zu verstehen.

    Gerade in C# gibt es keinen Grund, GoTos einzusetzen - nutze statt dessen Abbruch-Bedinungen:

    [...]
      foreach (NetworkInterface adapter in adapters)
                {
                    IPInterfaceProperties properties = adapter.GetIPProperties();
                    string dns = properties.DnsSuffix;
                    if (dns == "fritz.box") 
                    { 
                        idx = i;
                        break; //jumps out of the foreach loop!
                    }
                    i++;
                }
    
                if (idx == 99) 
                {
                    const string message = "Es wurde keine Verbindung zur fritz.box gefunden - Abbruch";
                    const string caption = "NetSpeedHK - keine fritz.box";
                    var result = MessageBox.Show(message, caption)    
    [...]                
    


  • Ich denke, ein anderer Ansatz würde hier besser funktionieren. Anstatt nach einem bestimmten Adapter zu suchen und dann für den die Statistik zu berechnen ist zu speziell. Andersherum die Statistik für alle Adapter zu bestimmen, und dann nur die Statistik für einen Adapter anzuzeigen, ist IMHO sinnvoller.

    @hkdd ,@tbird
    Ich würde das komplett in eine Funktion auslagern, die das NetworkInterface mit bestimmten Eigenschaften zurückgibt. Über Generics als Prädikat geht da bestimmt was. Wie gesagt, auf den Index würde ich nicht vertrauen.



  • Danke für Euere Hinweise.
    Ich habe über die Methode nachgedacht und einen anderen Ansatz gefunden.
    Nun wird bei allen Adaptern geprüft, ob es bereits Datenbewegungen gab.
    Es müssen die virtuellen Adapter von VMware ausgeschlossen werden, da bei denen ebenfalls Datenbewegungen angezeigt werden.
    Nach dem Namen FritzBox wird nicht mehr gefragt.

    Das Testprogramm sieht nun so aus

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Threading.Tasks;
    using System.Net.NetworkInformation;
    using System.Runtime.InteropServices;
    
    namespace NetConsole
    {
        class Program
        {
            static void Main(string[] args)
            {
                DisplayDnsConfiguration();
            }
    
            public static void DisplayDnsConfiguration()
            {
                int idx = 99;
                string NetIDX = "";
                int i = 0;
                NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface adapter in adapters)
                {
                    IPInterfaceProperties properties = adapter.GetIPProperties();
                    IPv4InterfaceStatistics interfaceStats = NetworkInterface.GetAllNetworkInterfaces()[i].GetIPv4Statistics();
                    decimal BySendReceived = interfaceStats.BytesSent + interfaceStats.BytesReceived;
    
                    Console.WriteLine("Index {0} ~ {1}",
                        i, adapter.Description);
                    Console.WriteLine("  DNS suffix .............................. : {0}",
                        properties.DnsSuffix);
                    Console.WriteLine("  adapter.Description ..................... : {0}",
                        adapter.Description);
                    Console.WriteLine("  adapter.Name ............................ : {0}",
                        adapter.Name);
                    Console.WriteLine("  adapter.NetworkInterfaceType ............ : {0}",
                        adapter.NetworkInterfaceType);
    
                    string aName = adapter.Name;
                    if (aName.Length > 6) { aName = adapter.Name.Substring(0, 6); }
                    if ((BySendReceived > 0) & (aName != "VMware"))
                    {
                        idx = i;
                        if (NetIDX.Length > 0)
                        {
                            NetIDX = NetIDX + " und ";
                        }
                        NetIDX = NetIDX + idx.ToString();
                    }
                    i++;
                }
                Console.WriteLine();
                Console.WriteLine("Netzwerk im Index: {0}", NetIDX);
    
                Console.ReadKey();
            }
        }
    }
    

    Das Ergebnis ist OK:

    Index 0 ~ Realtek Gaming 2.5GbE Family Controller #2
      DNS suffix .............................. : fritz.box
      adapter.Description ..................... : Realtek Gaming 2.5GbE Family Controller #2
      adapter.Name ............................ : Ethernet 4
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 1 ~ RZ608 Wi-Fi 6E 80MHz
      DNS suffix .............................. : fritz.box
      adapter.Description ..................... : RZ608 Wi-Fi 6E 80MHz
      adapter.Name ............................ : WLAN
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 2 ~ Microsoft Wi-Fi Direct Virtual Adapter
      DNS suffix .............................. :
      adapter.Description ..................... : Microsoft Wi-Fi Direct Virtual Adapter
      adapter.Name ............................ : LAN-Verbindung* 9
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 3 ~ Microsoft Wi-Fi Direct Virtual Adapter #2
      DNS suffix .............................. :
      adapter.Description ..................... : Microsoft Wi-Fi Direct Virtual Adapter #2
      adapter.Name ............................ : LAN-Verbindung* 10
      adapter.NetworkInterfaceType ............ : Wireless80211
    Index 4 ~ VMware Virtual Ethernet Adapter for VMnet1
      DNS suffix .............................. :
      adapter.Description ..................... : VMware Virtual Ethernet Adapter for VMnet1
      adapter.Name ............................ : VMware Network Adapter VMnet1
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 5 ~ VMware Virtual Ethernet Adapter for VMnet8
      DNS suffix .............................. :
      adapter.Description ..................... : VMware Virtual Ethernet Adapter for VMnet8
      adapter.Name ............................ : VMware Network Adapter VMnet8
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 6 ~ Bluetooth Device (Personal Area Network) #4
      DNS suffix .............................. :
      adapter.Description ..................... : Bluetooth Device (Personal Area Network) #4
      adapter.Name ............................ : Bluetooth-Netzwerkverbindung 4
      adapter.NetworkInterfaceType ............ : Ethernet
    Index 7 ~ Software Loopback Interface 1
      DNS suffix .............................. :
      adapter.Description ..................... : Software Loopback Interface 1
      adapter.Name ............................ : Loopback Pseudo-Interface 1
      adapter.NetworkInterfaceType ............ : Loopback
    
    Netzwerk im Index: 0
    

    Und im Programm NetSpeedHK gibt jetzt es folgende Netzwerk-Erkennung-Routine:

                idx = 99;
                int i = 0;
                int FoundCount = 0;
                NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface adapter in adapters)
                {
                    IPInterfaceProperties properties = adapter.GetIPProperties();
                    IPv4InterfaceStatistics interfaceStats = NetworkInterface.GetAllNetworkInterfaces()[i].GetIPv4Statistics();
                    decimal BySendReceived = interfaceStats.BytesSent + interfaceStats.BytesReceived;
    
                    string aName = adapter.Name;
                    if (aName.Length > 6) { aName = adapter.Name.Substring(0, 6); }
    
                    if ((BySendReceived > 0) & (aName != "VMware"))
                    {
                        FoundCount++; // Anzahl gefunden
                        idx = i;
                    }
                    i++;
                }
                           
                if ((idx == 99) || (FoundCount > 1)) 
                {
                    string Message = "";
                    if (idx == 99) { Message = "Es wurde keine Netzwerk-Verbindung gefunden - Abbruch"; }
                    if (FoundCount > 1) { Message = "Es gibt mehrere Netzwerk-Verbindungen - Abbruch"; }
                    const string Caption = "NetSpeedHK - keine Netzwerk-Verbindung";
                    MessageBox.Show(Message, Caption, MessageBoxButtons.OK);
    
                    Application.Exit();
                }
            }
    

Anmelden zum Antworten