Ich möchte die folgenden Details für alle Netzwerkkarten erhalten, die an meinen Computer angeschlossen sind:
1) Schnittstellenname (z. B. eth0)
2) Interface-Nummer (wie in Windows ), wenn so etwas unter Linux existiert
>3) NIC-Bandbreitenkapazität und -modus (z. B. 1 Gb / s Vollduplex)
Sie können getifaddrs()
/ freeifaddrs()
verwenden, um eine verknüpfte Liste zu erhalten aller Schnittstellen, dann ioctl(fd, SIOCGIFINDEX, struct ifreq *)
, um den Schnittstellenindex für jede Schnittstelle zu erhalten. Da die Schnittstellen fortlaufend sind und immer aufgelistet sind (unabhängig davon, ob sie aktiv sind oder nicht), wähle ich sie mit einer Schleife auf, die stattdessen ioctl(fd, SIOCGIFNAME, struct ifreq *)
verwendet. In allen Fällen ist fd
ein AF_INET
socket.
Um den Duplex und die Geschwindigkeit der Schnittstelle zu erhalten, müssen Sie ioctl(fd, SIOCETHTOOL, struct ifreq *)
verwenden, wobei ifr_data
auf struct ethtool_cmd
mit cmd = ETHTOOL_GSET
zeigt.
Die ioctls sollten -1 zurückgeben, wenn sie fehlschlagen, und einen nicht negativen Wert (Null, glaube ich), wenn es erfolgreich ist.
Hier ist ein Beispielprogramm:
%Vor% Wenn Sie das obige als iflist.c
speichern, können Sie es mit
Um die Verwendung anzuzeigen, führen Sie iflist -h
aus. Um alle Schnittstellen aufzulisten, führe sie ohne Parameter aus:
Im obigen Beispiel wird die von mir beschriebene Aufzählungsmethode verwendet. Um nur bestimmte Schnittstellen aufzulisten, führen Sie sie unter Benennung der Schnittstellen aus:
%Vor%Duplex und Geschwindigkeit werden natürlich nur für Ethernet-Schnittstellen aufgelistet.
Bearbeitet zum Hinzufügen:
Wenn das obige Programm die Bandbreite und den Modus für eine Schnittstelle nicht liefert, ist hier eine vereinfachte Version, die den genauen Grund (Fehler) meldet. Dieser nimmt die Schnittstellennamen als Kommandozeilenparameter; es zählt keine Schnittstellen.
%Vor%Fragen?
(1) getifaddrs ()
>(2) if_indextoname () , if_nameindex () , if_nametoindex ()
(3) Ich bin mir nicht sicher, aber vielleicht können Sie es über ioctl () und einer der SIOCGIF*
-Parameter oder von /proc
.
Der folgende Link erklärt die Funktion getifaddrs
mit einem Arbeitsbeispiel
Dieser Befehl listet alle Details zu eth1 auf, einschließlich Geschwindigkeit, Duplex, Port ...
Sie können popen () verwenden, um die Ausgabe zu erhalten und sie zuzuordnen.
POPEN (3) Linux-Programmierhandbuch
POPEN (3)NAME popen, pclose - pipe stream zu oder von einem Prozess
SYNOPSIS #include
%Vor%